精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
要点:
sd=socket(domain,type,protocol);
指定参数为:通信域,socket类型,通信协议。
connect(sd,&serv_addr,addrlen);
指定要通信的地址
read(sd,buf,nbytes);
write(sd,buf,nbytes);
是使用UNIX的I/O方式还是用发送接收函数,随后再讨论。close(sd);
shutdown(sd,how);
#include <sys/types.h>
#include <sys/socket.h>
int socket(int domain,int type,int protocol);
在成功时,返回一个非负数的整数,这个数理解为socket描述符,这类描述符和文件描述符类似。
域名 |
值 |
含意 |
PF_UNSPEC |
0 |
未定义 |
PF_LOCAL |
1 |
对应于PF_UNIX的POSIX下名称 |
PF_UNIX,PF_FILE |
PF_LOCAL |
Unix域socket |
PF_INET |
2 |
IPV4 |
PF_AX25 |
3 |
|
|
|
|
SOCK_STREAM
SOCK_DGRAM
SOCK_RAW
SOCK_RDM
SOCK_SEQPACKET
SOCK_PACKET
EPROTONOSUPPOT:类型或协议不支持
EAFNOSUPPORT:指定的地址簇不支持
ENFILE:没有足够的内核内在来创建socket结构
EMFILE:进程文件表溢出
EACCES:权限否决
ENOBUFS,ENOMEM:没有足够的内在来创建socket
EINVAL:不可知的协议或协议簇
#include <errno.h>
…
sd=socket(PF_INET,SOCK_STREAM,0);
if(sd<0) {
perror(“Failed to create the socket”);
exit(errno);
}
#include <sys/types.h>
#include <sys/socket.h>
int connect(int sd,const struct sockaddr*serv_addr,socklen_t addrlen);
struct sockaddr_un addr;
…
sd=socket(PF_LOCAL,SOCK_STREAM,0);
…
if(connect(sd,(struct sockaddr*)&addr,sizeof(addr)))
{
perror(“client connect”);exit(EXIT_FAILURE);
}
每类协议有它自己的地址结构。
EBADF:无效的描述符值
int getsockname(int sd,const struct sockaddr*local_addr,socklen_t addrlen);
会得到和描述符对应连接的地址和端口的信息
#include <unistd.h>
int close(int sd);
#include <sys/socket.h>
int shudown(int sd,int how);
这个函数在成功时返回0,失败的错误情况如下:
EBADF:描述符无效。
SHUT_RD:不再接收数据。在当前接收缓冲里的数据会被丢弃。
SHUT_WR:不再发送数据。在当前发送缓冲里的数据会被丢弃。
SHUT_RDWR:发收都停止。
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/un.h>
#define MSG_LEN 1024
int main(void)
{
struct sockaddr_un uaddr;
int msg_len,sd;
char message[MSG_LEN];
uaddr.sun_family=AF_UNIX;
strcpy(uaddr.sun_path,”/tmp/mysock”);
sd=socket(PF_UNIX,SOCK_STREAM,0);
connect(sd,(struct sockaddr*)&uaddr,sizeof(uaddr));
msg_len=strlen(fgets(message,MSG_LEN,stdin));
write(sd,message,msg_len);
close(sd);
exit(EXIT_SUCCESS);
}
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#define MSG_LEN 1024
#define PORT_NUMBER 7
int main (int argc, char **argv)
{
int sd, msg_len;
char message[MSG_LEN];
struct sockaddr_in addr;
struct hostent *hostent;
sd = socket (AF_INET, SOCK_STREAM, 0);
hostent = gethostbyname (argv[1]);addr.sin_family = AF_INET;
addr.sin_port = htons (PORT_NUMBER); //注意这里的网络顺序转换
memcpy (&addr.sin_addr, hostent->h_addr, hostent->h_length);
connect (sd, (struct sockaddr *)&addr, sizeof (addr));
msg_len = strlen (fgets (message, MSG_LEN, stdin));
write (sd, message, msg_len);
memset (message, 0, MSG_LEN);
msg_len = read (sd, message, MSG_LEN);
write (STDOUT_FILENO, message, msg_len);
close (sd);
exit (0);
}