接口处理篇
X5yLinux联盟
accept, X5yLinux联盟
bind, X5yLinux联盟
connect, X5yLinux联盟
endprotoent, X5yLinux联盟
endservent, X5yLinux联盟
getsockopt, X5yLinux联盟
htonl, X5yLinux联盟
htons, X5yLinux联盟
inet_addr, X5yLinux联盟
inet_aton, X5yLinux联盟
inet_ntoa, X5yLinux联盟
listen, X5yLinux联盟
ntohl, X5yLinux联盟
ntohs, X5yLinux联盟
recv, X5yLinux联盟
recvfrom, X5yLinux联盟
recvmsg, X5yLinux联盟
send, X5yLinux联盟
sendmsg, X5yLinux联盟
sendto, X5yLinux联盟
setprotoent, X5yLinux联盟
setservent, X5yLinux联盟
setsockopt, X5yLinux联盟
shutdown, X5yLinux联盟
socket, X5yLinux联盟
accept, X5yLinux联盟
bind, X5yLinux联盟
connect, X5yLinux联盟
endprotoent, X5yLinux联盟
endservent, X5yLinux联盟
getsockopt, X5yLinux联盟
htonl, X5yLinux联盟
htons, X5yLinux联盟
inet_addr, X5yLinux联盟
inet_aton, X5yLinux联盟
inet_ntoa, X5yLinux联盟
listen, X5yLinux联盟
ntohl, X5yLinux联盟
ntohs, X5yLinux联盟
recv, X5yLinux联盟
recvfrom, X5yLinux联盟
recvmsg, X5yLinux联盟
send, X5yLinux联盟
sendmsg, X5yLinux联盟
sendto, X5yLinux联盟
setprotoent, X5yLinux联盟
setservent, X5yLinux联盟
setsockopt, X5yLinux联盟
shutdown, X5yLinux联盟
socket, X5yLinux联盟
accept(接受socket连线) | |
相关函数
| socket,bind,listen,connectX5yLinux联盟 |
表头文件
| #includeX5yLinux联盟 #includeX5yLinux联盟 |
定义函数
| int accept(int s,struct sockaddr * addr,int * addrlen);X5yLinux联盟 |
函数说明
| accept ()用来接受参数s的socket连线。参数s的socket必需先经bind()、listen()函数处理过,当有连线进来时accept()会返回一个新的socket处理代码,往后的数据传送与读取就是经由新的socket处理,而原来参数s的socket能继续使用accept()来接受新的连线要求。连线成功时,参数addr所指的结构会被系统填入远程主机的地址数据,参数addrlen为scokaddr的结构长度。关于结构 sockaddr的定义请参考bind()。X5yLinux联盟 |
返回值
| 成功则返回新的socket处理代码,失败返回-1,错误原因存于errno中。X5yLinux联盟 |
错误代码
| EBADF 参数s 非合法socket处理代码。X5yLinux联盟 EFAULT 参数addr指针指向无法存取的内存空间。X5yLinux联盟 ENOTSOCK 参数s为一文件描述词,非socket。X5yLinux联盟 EOPNOTSUPP 指定的socket并非SOCK_STREAM。X5yLinux联盟 EPERM 防火墙拒绝此连线。X5yLinux联盟 ENOBUFS 系统的缓冲内存不足。X5yLinux联盟 ENOMEM 核心内存不足。X5yLinux联盟 |
范例
| 参考listen()。X5yLinux联盟 |
X5yLinux联盟 | X5yLinux联盟 bind(对socket定位) |
相关函数
| socket,accept,connect,listenX5yLinux联盟 |
表头文件
| #includeX5yLinux联盟 #includeX5yLinux联盟 |
定义函数
| int bind(int sockfd,struct sockaddr * my_addr,int addrlen);X5yLinux联盟 |
函数说明
| bind()用来设置给参数sockfd的socket一个名称。此名称由参数my_addr指向一sockaddr结构,对于不同的socket domain定义了一个通用的数据结构X5yLinux联盟 struct sockaddrX5yLinux联盟 {X5yLinux联盟 unsigned short int sa_family;X5yLinux联盟 char sa_data[14];X5yLinux联盟 };X5yLinux联盟 sa_family 为调用socket()时的domain参数,即AF_xxxx值。X5yLinux联盟 sa_data 最多使用14个字符长度。X5yLinux联盟 此sockaddr结构会因使用不同的socket domain而有不同结构定义,例如使用AF_INET domain,其socketaddr结构定义便为X5yLinux联盟 struct socketaddr_inX5yLinux联盟 {X5yLinux联盟 unsigned short int sin_family;X5yLinux联盟 uint16_t sin_port;X5yLinux联盟 struct in_addr sin_addr;X5yLinux联盟 unsigned char sin_zero[8];X5yLinux联盟 };X5yLinux联盟 struct in_addrX5yLinux联盟 {X5yLinux联盟 uint32_t s_addr;X5yLinux联盟 };X5yLinux联盟 sin_family 即为sa_familyX5yLinux联盟 sin_port 为使用的port编号X5yLinux联盟 sin_addr.s_addr 为IP 地址X5yLinux联盟 sin_zero 未使用。X5yLinux联盟 |
参数
| addrlen为sockaddr的结构长度。X5yLinux联盟 |
返回值
| 成功则返回0,失败返回-1,错误原因存于errno中。X5yLinux联盟 |
错误代码
| EBADF 参数sockfd 非合法socket处理代码。X5yLinux联盟 EACCESS 权限不足X5yLinux联盟 ENOTSOCK 参数sockfd为一文件描述词,非socket。X5yLinux联盟 |
范例
| 参考listen()X5yLinux联盟 |
X5yLinux联盟 | X5yLinux联盟 connect(建立socket连线) |
相关函数
| socket,bind,listenX5yLinux联盟 |
表头文件
| #includeX5yLinux联盟 #includeX5yLinux联盟 |
定义函数
| int connect (int sockfd,struct sockaddr * serv_addr,int addrlen);X5yLinux联盟 |
函数说明
| connect()用来将参数sockfd 的socket 连至参数serv_addr 指定的网络地址。结构sockaddr请参考bind()。参数addrlen为sockaddr的结构长度。X5yLinux联盟 |
返回值
| 成功则返回0,失败返回-1,错误原因存于errno中。X5yLinux联盟 |
错误代码
| EBADF 参数sockfd 非合法socket处理代码X5yLinux联盟 EFAULT 参数serv_addr指针指向无法存取的内存空间X5yLinux联盟 ENOTSOCK 参数sockfd为一文件描述词,非socket。X5yLinux联盟 EISCONN 参数sockfd的socket已是连线状态X5yLinux联盟 ECONNREFUSED 连线要求被server端拒绝。X5yLinux联盟 ETIMEDOUT 企图连线的操作超过限定时间仍未有响应。X5yLinux联盟 ENETUNREACH 无法传送数据包至指定的主机。X5yLinux联盟 EAFNOSUPPORT sockaddr结构的sa_family不正确。X5yLinux联盟 EALREADY socket为不可阻断且先前的连线操作还未完成。X5yLinux联盟 |
范例
| X5yLinux联盟 #includeX5yLinux联盟 #includeX5yLinux联盟 #includeX5yLinux联盟 #includeX5yLinux联盟 #includeX5yLinux联盟 #includeX5yLinux联盟 #includeX5yLinux联盟 #define PORT 1234X5yLinux联盟 #define SERVER_IP “127.0.0.1”X5yLinux联盟 main()X5yLinux联盟 {X5yLinux联盟 int s;X5yLinux联盟 struct sockaddr_in addr;X5yLinux联盟 char buffer[256];X5yLinux联盟 if((s = socket(AF_INET,SOCK_STREAM,0))<0){X5yLinux联盟 perror(“socket”);X5yLinux联盟 exit(1);X5yLinux联盟 }X5yLinux联盟 X5yLinux联盟 bzero(&addr,sizeof(addr));X5yLinux联盟 addr.sin_family = AF_INET;X5yLinux联盟 addr.sin_port=htons(PORT);X5yLinux联盟 addr.sin_addr.s_addr = inet_addr(SERVER_IP);X5yLinux联盟 X5yLinux联盟 if(connect(s,&addr,sizeof(addr))<0){X5yLinux联盟 perror(“connect”);X5yLinux联盟 exit(1);X5yLinux联盟 }X5yLinux联盟 X5yLinux联盟 recv(s,buffer,sizeof(buffer),0);X5yLinux联盟 printf(“%s\n”,buffer);X5yLinux联盟 while(1){X5yLinux联盟 bzero(buffer,sizeof(buffer));X5yLinux联盟 X5yLinux联盟 read(STDIN_FILENO,buffer,sizeof(buffer));X5yLinux联盟 X5yLinux联盟 if(send(s,buffer,sizeof(buffer),0)<0){X5yLinux联盟 perror(“send”);X5yLinux联盟 exit(1);X5yLinux联盟 }X5yLinux联盟 }X5yLinux联盟 }X5yLinux联盟 |
执行
| $ ./connectX5yLinux联盟 Welcome to server!X5yLinux联盟 hi I am client! X5yLinux联盟 X5yLinux联盟 |
X5yLinux联盟 | X5yLinux联盟 endprotoent(结束网络协议数据的读取) |
相关函数
| getprotoent,getprotobyname,getprotobynumber,setprotoentX5yLinux联盟 |
表头文件
| #includeX5yLinux联盟 |
定义函数
| void endprotoent(void);X5yLinux联盟 |
函数说明
| endprotoent()用来关闭由getprotoent()打开的文件。X5yLinux联盟 |
返回值
| X5yLinux联盟 |
范例
| 参考getprotoent()X5yLinux联盟 |
X5yLinux联盟 | X5yLinux联盟 endservent(结束网络服务数据的读取) |
相关函数
| getservent,getservbyname,getservbyport,setserventX5yLinux联盟 |
表头文件
| #includeX5yLinux联盟 |
定义函数
| void endservent(void);X5yLinux联盟 |
函数说明
| endservent()用来关闭由getservent()所打开的文件。X5yLinux联盟 |
返回值
| X5yLinux联盟 |
范例
| 参考getservent()。X5yLinux联盟 |
X5yLinux联盟 | X5yLinux联盟 getsockopt(取得socket状态) |
相关函数
| setsockoptX5yLinux联盟 |
表头文件
| #includeX5yLinux联盟 #includeX5yLinux联盟 |
定义函数
| int getsockopt(int s,int level,int optname,void* optval,socklen_t* optlen);X5yLinux联盟 |
函数说明
| getsockopt()会将参数s所指定的socket状态返回。参数optname代表欲取得何种选项状态,而参数optval则指向欲保存结果的内存地址,参数optlen则为该空间的大小。参数level、optname请参考setsockopt()。X5yLinux联盟 |
返回值
| 成功则返回0,若有错误则返回-1,错误原因存于errnoX5yLinux联盟 |
错误代码
| EBADF 参数s 并非合法的socket处理代码X5yLinux联盟 ENOTSOCK 参数s为一文件描述词,非socketX5yLinux联盟 ENOPROTOOPT 参数optname指定的选项不正确X5yLinux联盟 EFAULT 参数optval指针指向无法存取的内存空间X5yLinux联盟 |
范例
| #includeX5yLinux联盟 #includeX5yLinux联盟 main()X5yLinux联盟 {X5yLinux联盟 int s,optval,optlen = sizeof(int);X5yLinux联盟 if((s = socket(AF_INET,SOCK_STREAM,0))<0) perror(“socket”);X5yLinux联盟 getsockopt(s,SOL_SOCKET,SO_TYPE,&optval,&optlen);X5yLinux联盟 printf(“optval = %d\n”,optval);X5yLinux联盟 close(s);}X5yLinux联盟 |
执行
| optval = 1 X5yLinux联盟 |
X5yLinux联盟 | X5yLinux联盟 htonl(将32位主机字符顺序转换成网络字符顺序) |
相关函数
| htons,ntohl,ntohsX5yLinux联盟 |
表头文件
| #includeX5yLinux联盟 |
定义函数
| unsigned long int htonl(unsigned long int hostlong);X5yLinux联盟 |
函数说明
| htonl()用来将参数指定的32位hostlong 转换成网络字符顺序。X5yLinux联盟 |
返回值
| 返回对应的网络字符顺序。X5yLinux联盟 |
范例
| 参考getservbyport()或connect()。X5yLinux联盟 |
X5yLinux联盟 | X5yLinux联盟 htons(将16位主机字符顺序转换成网络字符顺序) |
相关函数
| htonl,ntohl,ntohsX5yLinux联盟 |
表头文件
| #includeX5yLinux联盟 |
定义函数
| unsigned short int htons(unsigned short int hostshort);X5yLinux联盟 |
函数说明
| htons()用来将参数指定的16位hostshort转换成网络字符顺序。X5yLinux联盟 |
返回值
| 返回对应的网络字符顺序。X5yLinux联盟 |
范例
| 参考connect()。X5yLinux联盟 |
X5yLinux联盟 | X5yLinux联盟 inet_addr(将网络地址转成二进制的数字) |
相关函数
| inet_aton,inet_ntoaX5yLinux联盟 |
表头文件
| #includeX5yLinux联盟 #includeX5yLinux联盟 #includeX5yLinux联盟 |
定义函数
| unsigned long int inet_addr(const char *cp);X5yLinux联盟 |
函数说明
| inet_addr()用来将参数cp所指的网络地址字符串转换成网络所使用的二进制数字。网络地址字符串是以数字和点组成的字符串,例如:“163.13.132.68”。X5yLinux联盟 |
返回值
| 成功则返回对应的网络二进制的数字,失败返回-1。X5yLinux联盟 |
X5yLinux联盟 | X5yLinux联盟 inet_aton(将网络地址转成网络二进制的数字) |
相关函数
| inet_addr,inet_ntoaX5yLinux联盟 |
表头文件
| #includeX5yLinux联盟 #includeX5yLinux联盟 #includeX5yLinux联盟 |
定义函数
| int inet_aton(const char * cp,struct in_addr *inp);X5yLinux联盟 |
函数说明
| inet_aton()用来将参数cp所指的网络地址字符串转换成网络使用的二进制的数字,然后存于参数inp所指的in_addr结构中。X5yLinux联盟 结构in_addr定义如下X5yLinux联盟 struct in_addrX5yLinux联盟 {X5yLinux联盟 unsigned long int s_addr;X5yLinux联盟 };X5yLinux联盟 |
返回值
| 成功则返回非0值,失败则返回0。X5yLinux联盟 |
X5yLinux联盟 | X5yLinux联盟 inet_ntoa(将网络二进制的数字转换成网络地址) |
相关函数
| inet_addr,inet_atonX5yLinux联盟 |
表头文件
| #includeX5yLinux联盟 #includeX5yLinux联盟 #includeX5yLinux联盟 |
定义函数
| char * inet_ntoa(struct in_addr in);X5yLinux联盟 |
函数说明
| inet_ntoa()用来将参数in所指的网络二进制的数字转换成网络地址,然后将指向此网络地址字符串的指针返回。X5yLinux联盟 |
返回值
| 成功则返回字符串指针,失败则返回NULL。X5yLinux联盟 |
X5yLinux联盟 | X5yLinux联盟 listen(等待连接) |
相关函数
| socket,bind,accept,connectX5yLinux联盟 |
表头文件
| #includeX5yLinux联盟 |
定义函数
| int listen(int s,int backlog);X5yLinux联盟 |
函数说明
| listen ()用来等待参数s 的socket连线。参数backlog指定同时能处理的最大连接要求,如果连接数目达此上限则client端将收到ECONNREFUSED的错误。 Listen()并未开始接收连线,只是设置socket为listen模式,真正接收client端连线的是accept()。通常listen()会在socket(),bind()之后调用,接着才调用accept()。X5yLinux联盟 |
返回值
| 成功则返回0,失败返回-1,错误原因存于errnoX5yLinux联盟 |
附加说明
| listen()只适用SOCK_STREAM或SOCK_SEQPACKET的socket类型。如果socket为AF_INET则参数backlog 最大值可设至128。X5yLinux联盟 |
错误代码
| EBADF 参数sockfd非合法socket处理代码X5yLinux联盟 EACCESS 权限不足X5yLinux联盟 EOPNOTSUPP 指定的socket并未支援listen模式。X5yLinux联盟 |
范例
| #includeX5yLinux联盟 #includeX5yLinux联盟 #includeX5yLinux联盟 #includeX5yLinux联盟 #includeX5yLinux联盟 #define PORT 1234X5yLinux联盟 #define MAXSOCKFD 10X5yLinux联盟 main()X5yLinux联盟 {X5yLinux联盟 int sockfd,newsockfd,is_connected[MAXSOCKFD],fd;X5yLinux联盟 struct sockaddr_in addr;X5yLinux联盟 int addr_len = sizeof(struct sockaddr_in);X5yLinux联盟 fd_set readfds;X5yLinux联盟 char buffer[256];X5yLinux联盟 char msg[ ] =”Welcome to server!”;X5yLinux联盟 if ((sockfd = socket(AF_INET,SOCK_STREAM,0))<0){X5yLinux联盟 perror(“socket”);X5yLinux联盟 exit(1);X5yLinux联盟 }X5yLinux联盟 bzero(&addr,sizeof(addr));X5yLinux联盟 addr.sin_family =AF_INET;X5yLinux联盟 addr.sin_port = htons(PORT);X5yLinux联盟 addr.sin_addr.s_addr = htonl(INADDR_ANY);X5yLinux联盟 if(bind(sockfd,&addr,sizeof(addr))<0){X5yLinux联盟 perror(“connect”);X5yLinux联盟 exit(1);X5yLinux联盟 }X5yLinux联盟 if(listen(sockfd,3)<0){X5yLinux联盟 perror(“listen”);X5yLinux联盟 exit(1);X5yLinux联盟 }X5yLinux联盟 for(fd=0;fdX5yLinux联盟 is_connected[fd]=0;X5yLinux联盟 while(1){X5yLinux联盟 FD_ZERO(&readfds);X5yLinux联盟 FD_SET(sockfd,&readfds);X5yLinux联盟 for(fd=0;fdX5yLinux联盟 if(is_connected[fd]) FD_SET(fd,&readfds);X5yLinux联盟 if(!select(MAXSOCKFD,&readfds,NULL,NULL,NULL))continue;X5yLinux联盟 for(fd=0;fdX5yLinux联盟 if(FD_ISSET(fd,&readfds)){X5yLinux联盟 if(sockfd = =fd){X5yLinux联盟 if((newsockfd = accept (sockfd,&addr,&addr_len))<0)X5yLinux联盟 perror(“accept”);X5yLinux联盟 write(newsockfd,msg,sizeof(msg));X5yLinux联盟 is_connected[newsockfd] =1;X5yLinux联盟 printf(“cnnect from %s\n”,inet_ntoa(addr.sin_addr));X5yLinux联盟 }else{X5yLinux联盟 bzero(buffer,sizeof(buffer));X5yLinux联盟 if(read(fd,buffer,sizeof(buffer))<=0){X5yLinux联盟 printf(“connect closed.\n”);X5yLinux联盟 is_connected[fd]=0;X5yLinux联盟 close(fd);X5yLinux联盟 }elseX5yLinux联盟 printf(“%s”,buffer);X5yLinux联盟 }X5yLinux联盟 }X5yLinux联盟 }X5yLinux联盟 }X5yLinux联盟 |
执行
| $ ./listenX5yLinux联盟 connect from 127.0.0.1X5yLinux联盟 hi I am clientX5yLinux联盟 connected closed.X5yLinux联盟 |
X5yLinux联盟 | X5yLinux联盟 ntohl(将32位网络字符顺序转换成主机字符顺序) |
相关函数
| htonl,htons,ntohsX5yLinux联盟 |
表头文件
| #includeX5yLinux联盟 |
定义函数
| unsigned long int ntohl(unsigned long int netlong);X5yLinux联盟 |
函数说明
| ntohl()用来将参数指定的32位netlong转换成主机字符顺序。X5yLinux联盟 |
返回值
| 返回对应的主机字符顺序。X5yLinux联盟 |
范例
| 参考getservent()。X5yLinux联盟 |
X5yLinux联盟 | X5yLinux联盟 ntohs(将16位网络字符顺序转换成主机字符顺序) |
相关函数
| htonl,htons,ntohlX5yLinux联盟 |
表头文件
| #includeX5yLinux联盟 |
定义函数
| unsigned short int ntohs(unsigned short int netshort);X5yLinux联盟 |
函数说明
| ntohs()用来将参数指定的16位netshort转换成主机字符顺序。X5yLinux联盟 |
返回值
| 返回对应的主机顺序。X5yLinux联盟 |
范例
| 参考getservent()。X5yLinux联盟 |
X5yLinux联盟 | X5yLinux联盟 recv(经socket接收数据) |
相关函数
| recvfrom,recvmsg,send,sendto,socketX5yLinux联盟 |
表头文件
| #includeX5yLinux联盟 #includeX5yLinux联盟 |
定义函数
| int recv(int s,void *buf,int len,unsigned int flags);X5yLinux联盟 |
函数说明
| recv()用来接收远端主机经指定的socket传来的数据,并把数据存到由参数buf 指向的内存空间,参数len为可接收数据的最大长度。X5yLinux联盟 |
参数
| flags一般设0。其他数值定义如下:X5yLinux联盟 MSG_OOB 接收以out-of-band 送出的数据。X5yLinux联盟 MSG_PEEK 返回来的数据并不会在系统内删除,如果再调用recv()会返回相同的数据内容。X5yLinux联盟 MSG_WAITALL强迫接收到len大小的数据后才能返回,除非有错误或信号产生。X5yLinux联盟 MSG_NOSIGNAL此操作不愿被SIGPIPE信号中断返回值成功则返回接收到的字符数,失败返回-1,错误原因存于errno中。X5yLinux联盟 |
错误代码
| EBADF 参数s非合法的socket处理代码X5yLinux联盟 EFAULT 参数中有一指针指向无法存取的内存空间X5yLinux联盟 ENOTSOCK 参数s为一文件描述词,非socket。X5yLinux联盟 EINTR 被信号所中断X5yLinux联盟 EAGAIN 此动作会令进程阻断,但参数s的socket为不可阻断X5yLinux联盟 ENOBUFS 系统的缓冲内存不足。X5yLinux联盟 ENOMEM 核心内存不足X5yLinux联盟 EINVAL 传给系统调用的参数不正确。X5yLinux联盟 |
范例
| 参考listen()。X5yLinux联盟 |
X5yLinux联盟 | X5yLinux联盟 recvfrom(经socket接收数据) |
相关函数
| recv,recvmsg,send,sendto,socketX5yLinux联盟 |
表头文件
| #includeX5yLinux联盟 #includeX5yLinux联盟 |
定义函数
| int recvfrom(int s,void *buf,int len,unsigned int flags ,struct sockaddr *from ,int *fromlen);X5yLinux联盟 |
函数说明
| recv ()用来接收远程主机经指定的socket 传来的数据,并把数据存到由参数buf 指向的内存空间,参数len 为可接收数据的最大长度。参数flags 一般设0,其他数值定义请参考recv()。参数from用来指定欲传送的网络地址,结构sockaddr 请参考bind()。参数fromlen为sockaddr的结构长度。X5yLinux联盟 |
返回值
| 成功则返回接收到的字符数,失败则返回-1,错误原因存于errno中。X5yLinux联盟 |
错误代码
| EBADF 参数s非合法的socket处理代码X5yLinux联盟 EFAULT 参数中有一指针指向无法存取的内存空间。X5yLinux联盟 ENOTSOCK 参数s为一文件描述词,非socket。X5yLinux联盟 EINTR 被信号所中断。X5yLinux联盟 EAGAIN 此动作会令进程阻断,但参数s的socket为不可阻断。X5yLinux联盟 ENOBUFS 系统的缓冲内存不足X5yLinux联盟 ENOMEM 核心内存不足X5yLinux联盟 EINVAL 传给系统调用的参数不正确。X5yLinux联盟 |
范例
| X5yLinux联盟 #includeX5yLinux联盟 #includeX5yLinux联盟 #includeX5yLinux联盟 #includeX5yLinux联盟 #includeX5yLinux联盟 #includeX5yLinux联盟 #includeX5yLinux联盟 #define PORT 2345X5yLinux联盟 #define SERVER_IP “127.0.0.1”X5yLinux联盟 main()X5yLinux联盟 {X5yLinux联盟 int s,len;X5yLinux联盟 struct sockaddr_in addr;X5yLinux联盟 int addr_len =sizeof(struct sockaddr_in);X5yLinux联盟 char buffer[256];X5yLinux联盟 X5yLinux联盟 if((s = socket(AF_INET,SOCK_DGRAM,0))<0){X5yLinux联盟 perror(“socket”);X5yLinux联盟 exit(1);X5yLinux联盟 }X5yLinux联盟 X5yLinux联盟 bzero(&addr,sizeof(addr));X5yLinux联盟 addr.sin_family = AF_INET;X5yLinux联盟 addr.sin_port = htons(PORT);X5yLinux联盟 addr.sin_addr.s_addr = inet_addr(SERVER_IP);X5yLinux联盟 while(1){X5yLinux联盟 bzero(buffer,sizeof(buffer));X5yLinux联盟 X5yLinux联盟 len =read(STDIN_FILENO,buffer,sizeof(buffer));X5yLinux联盟 X5yLinux联盟 sendto(s,buffer,len,0,&addr,addr_len);X5yLinux联盟 X5yLinux联盟 len = recvfrom(s,buffer,sizeof(buffer),0,&addr,&addr_len);X5yLinux联盟 printf(“receive: %s”,buffer);X5yLinux联盟 }X5yLinux联盟 }X5yLinux联盟 |
执行
| (先执行udp server 再执行udp client)X5yLinux联盟 hello X5yLinux联盟 receive: hello X5yLinux联盟 |
X5yLinux联盟 | X5yLinux联盟 recvmsg(经socket接收数据) |
相关函数
| recv,recvfrom,send,sendto,sendmsg,socketX5yLinux联盟 |
表头文件
| #includeX5yLinux联盟 #includeX5yLinux联盟 |
定义函数
| int recvmsg(int s,struct msghdr *msg,unsigned int flags);X5yLinux联盟 |
函数说明
| recvmsg ()用来接收远程主机经指定的socket传来的数据。参数s为已建立好连线的socket,如果利用UDP协议则不需经过连线操作。参数msg指向欲连线的数据结构内容,参数flags一般设0,详细描述请参考send()。关于结构msghdr的定义请参考sendmsg()。X5yLinux联盟 |
返回值
| 成功则返回接收到的字符数,失败则返回-1,错误原因存于errno中。X5yLinux联盟 |
错误代码
| EBADF 参数s非合法的socket处理代码。X5yLinux联盟 EFAULT 参数中有一指针指向无法存取的内存空间X5yLinux联盟 ENOTSOCK 参数s为一文件描述词,非socket。X5yLinux联盟 EINTR 被信号所中断。X5yLinux联盟 EAGAIN 此操作会令进程阻断,但参数s的socket为不可阻断。X5yLinux联盟 ENOBUFS 系统的缓冲内存不足X5yLinux联盟 ENOMEM 核心内存不足X5yLinux联盟 EINVAL 传给系统调用的参数不正确。X5yLinux联盟 |
范例
| 参考recvfrom()。X5yLinux联盟 |
X5yLinux联盟 | X5yLinux联盟 send(经socket传送数据) |
相关函数
| sendto,sendmsg,recv,recvfrom,socketX5yLinux联盟 |
表头文件
| #includeX5yLinux联盟 #includeX5yLinux联盟 |
定义函数
| int send(int s,const void * msg,int len,unsigned int falgs);X5yLinux联盟 |
函数说明
| send()用来将数据由指定的socket 传给对方主机。参数s为已建立好连接的socket。参数msg指向欲连线的数据内容,参数len则为数据长度。参数flags一般设0,其他数值定义如下X5yLinux联盟 MSG_OOB 传送的数据以out-of-band 送出。X5yLinux联盟 MSG_DONTROUTE 取消路由表查询X5yLinux联盟 MSG_DONTWAIT 设置为不可阻断运作X5yLinux联盟 MSG_NOSIGNAL 此动作不愿被SIGPIPE 信号中断。X5yLinux联盟 |
返回值
| 成功则返回实际传送出去的字符数,失败返回-1。错误原因存于errnoX5yLinux联盟 |
错误代码
| EBADF 参数s 非合法的socket处理代码。X5yLinux联盟 EFAULT 参数中有一指针指向无法存取的内存空间X5yLinux联盟 ENOTSOCK 参数s为一文件描述词,非socket。X5yLinux联盟 EINTR 被信号所中断。X5yLinux联盟 EAGAIN 此操作会令进程阻断,但参数s的socket为不可阻断。X5yLinux联盟 ENOBUFS 系统的缓冲内存不足X5yLinux联盟 ENOMEM 核心内存不足X5yLinux联盟 EINVAL 传给系统调用的参数不正确。X5yLinux联盟 |
范例
| 参考connect()X5yLinux联盟 |
X5yLinux联盟 | X5yLinux联盟 sendmsg(经socket传送数据) |
相关函数
| send,sendto,recv,recvfrom,recvmsg,socketX5yLinux联盟 |
表头文件
| #includeX5yLinux联盟 #includeX5yLinux联盟 |
定义函数
| int sendmsg(int s,const strcut msghdr *msg,unsigned int flags);X5yLinux联盟 |
函数说明
| sendmsg()用来将数据由指定的socket传给对方主机。参数s为已建立好连线的socket,如果利用UDP协议则不需经过连线操作。参数msg 指向欲连线的数据结构内容,参数flags一般默认为0,详细描述请参考send()。X5yLinux联盟 结构msghdr定义如下X5yLinux联盟 struct msghdrX5yLinux联盟 {X5yLinux联盟 void *msg_name; X5yLinux联盟 socklen_t msg_namelen; X5yLinux联盟 strcut iovec * msg_iov; X5yLinux联盟 size_t msg_iovlen; X5yLinux联盟 void * msg_control; X5yLinux联盟 size_t msg_controllen; X5yLinux联盟 int msg_flags; X5yLinux联盟 };X5yLinux联盟 |
返回值
| 成功则返回实际传送出去的字符数,失败返回-1,错误原因存于errnoX5yLinux联盟 |
错误代码
| EBADF 参数s 非合法的socket处理代码。X5yLinux联盟 EFAULT 参数中有一指针指向无法存取的内存空间X5yLinux联盟 ENOTSOCK 参数s为一文件描述词,非socket。X5yLinux联盟 EINTR 被信号所中断。X5yLinux联盟 EAGAIN 此操作会令进程阻断,但参数s的socket为不可阻断。X5yLinux联盟 ENOBUFS 系统的缓冲内存不足X5yLinux联盟 ENOMEM 核心内存不足X5yLinux联盟 EINVAL 传给系统调用的参数不正确。X5yLinux联盟 |
范例
| 参考sendto()。X5yLinux联盟 |
X5yLinux联盟 | X5yLinux联盟 sendto(经socket传送数据) |
相关函数
| send , sendmsg,recv , recvfrom , socketX5yLinux联盟 |
表头文件
| #include < sys/types.h >X5yLinux联盟 #include < sys/socket.h >X5yLinux联盟 |
定义函数
| int sendto ( int s , const void * msg, int len, unsigned int flags, const X5yLinux联盟 struct sockaddr * to , int tolen ) ;X5yLinux联盟 |
函数说明
| sendto() 用来将数据由指定的socket传给对方主机。参数s为已建好连线的socket,如果利用UDP协议则不需经过连线操作。参数msg指向欲连线的数据内容,参数flags 一般设0,详细描述请参考send()。参数to用来指定欲传送的网络地址,结构sockaddr请参考bind()。参数tolen为sockaddr 的结果长度。X5yLinux联盟 |
返回值
| 成功则返回实际传送出去的字符数,失败返回-1,错误原因存于errno 中。X5yLinux联盟 |
错误代码
| EBADF 参数s非法的socket处理代码。X5yLinux联盟 EFAULT 参数中有一指针指向无法存取的内存空间。X5yLinux联盟 WNOTSOCK canshu s为一文件描述词,非socket。X5yLinux联盟 EINTR 被信号所中断。X5yLinux联盟 EAGAIN 此动作会令进程阻断,但参数s的soket为补课阻断的。X5yLinux联盟 ENOBUFS 系统的缓冲内存不足。X5yLinux联盟 EINVAL 传给系统调用的参数不正确。X5yLinux联盟 |
范例
| #include < sys/types.h >X5yLinux联盟 #include < sys/socket.h >X5yLinux联盟 # include X5yLinux联盟 #include X5yLinux联盟 #define PORT 2345 X5yLinux联盟 main(){X5yLinux联盟 int sockfd,len;X5yLinux联盟 struct sockaddr_in addr;X5yLinux联盟 char buffer[256];X5yLinux联盟 X5yLinux联盟 if(sockfd=socket (AF_INET,SOCK_DGRAM,0))<0){X5yLinux联盟 perror (“socket”);X5yLinux联盟 exit(1);X5yLinux联盟 }X5yLinux联盟 X5yLinux联盟 bzero ( &addr, sizeof(addr) );X5yLinux联盟 addr.sin_family=AF_INET;X5yLinux联盟 addr.sin_port=htons(PORT);X5yLinux联盟 addr.sin_addr=hton1(INADDR_ANY) ;X5yLinux联盟 if (bind(sockfd, &addr, sizeof(addr))<0){X5yLinux联盟 perror(“connect”);X5yLinux联盟 exit(1);X5yLinux联盟 }X5yLinux联盟 while(1){X5yLinux联盟 bezro(buffer,sizeof(buffer));X5yLinux联盟 len = recvfrom(socket,buffer,sizeof(buffer), 0 , &addr &addr_len);X5yLinux联盟 X5yLinux联盟 printf(“receive from %s\n “ , inet_ntoa( addr.sin_addr));X5yLinux联盟 X5yLinux联盟 sendto(sockfd,buffer,len,0,&addr,addr_len);”X5yLinux联盟 }X5yLinux联盟 }X5yLinux联盟 |
执行
| 请参考recvfrom()X5yLinux联盟 |
X5yLinux联盟 | X5yLinux联盟 setprotoent(打开网络协议的数据文件) |
相关函数
| getprotobyname, getprotobynumber, endprotoentX5yLinux联盟 |
表头文件
| #include X5yLinux联盟 |
定义函数
| void setprotoent (int stayopen);X5yLinux联盟 |
函数说明
| setprotoent()用来打开/etc/protocols, 如果参数stayopen值为1,则接下来的getprotobyname()或getprotobynumber()将不会自动关闭此文件。X5yLinux联盟 |
X5yLinux联盟 | X5yLinux联盟 setservent(打开主机网络服务的数据文件) |
相关函数
| getservent, getservbyname, getservbyport, endserventX5yLinux联盟 |
表头文件
| #include < netdb.h >X5yLinux联盟 |
定义函数
| void setservent (int stayopen);X5yLinux联盟 |
函数说明
| setservent()用来打开/etc/services,如果参数stayopen值为1,则接下来的getservbyname()或getservbyport()将补回自动关闭文件。X5yLinux联盟 |
X5yLinux联盟 | X5yLinux联盟 setsockopt(设置socket状态) |
相关函数
| getsockoptX5yLinux联盟 |
表头文件
| #includeX5yLinux联盟 #includeX5yLinux联盟 |
定义函数
| int setsockopt(int s,int level,int optname,const void * optval,,socklen_toptlen);X5yLinux联盟 |
函数说明
| setsockopt()用来设置参数s所指定的socket状态。参数level代表欲设置的网络层,一般设成SOL_SOCKET以存取socket层。参数optname代表欲设置的选项,有下列几种数值:X5yLinux联盟 SO_DEBUG 打开或关闭排错模式X5yLinux联盟 SO_REUSEADDR 允许在bind()过程中本地地址可重复使用X5yLinux联盟 SO_TYPE 返回socket形态。X5yLinux联盟 SO_ERROR 返回socket已发生的错误原因X5yLinux联盟 SO_DONTROUTE 送出的数据包不要利用路由设备来传输。X5yLinux联盟 SO_BROADCAST 使用广播方式传送X5yLinux联盟 SO_SNDBUF 设置送出的暂存区大小X5yLinux联盟 SO_RCVBUF 设置接收的暂存区大小X5yLinux联盟 SO_KEEPALIVE 定期确定连线是否已终止。X5yLinux联盟 SO_OOBINLINE 当接收到OOB 数据时会马上送至标准输入设备X5yLinux联盟 SO_LINGER 确保数据安全且可靠的传送出去。X5yLinux联盟 |
参数
| optval代表欲设置的值,参数optlen则为optval的长度。X5yLinux联盟 |
返回值
| 成功则返回0,若有错误则返回-1,错误原因存于errno。X5yLinux联盟 |
附加说明
| EBADF 参数s并非合法的socket处理代码X5yLinux联盟 ENOTSOCK 参数s为一文件描述词,非socketX5yLinux联盟 ENOPROTOOPT 参数optname指定的选项不正确。X5yLinux联盟 EFAULT 参数optval指针指向无法存取的内存空间。X5yLinux联盟 |
范例
| 参考getsockopt()。X5yLinux联盟 |
X5yLinux联盟 | X5yLinux联盟 shutdown(终止socket通信) |
相关函数
| socket,connectX5yLinux联盟 |
表头文件
| #includeX5yLinux联盟 |
定义函数
| int shutdown(int s,int how);X5yLinux联盟 |
函数说明
| shutdown()用来终止参数s所指定的socket连线。参数s是连线中的socket处理代码,参数how有下列几种情况:X5yLinux联盟 how=0 终止读取操作。X5yLinux联盟 how=1 终止传送操作X5yLinux联盟 how=2 终止读取及传送操作X5yLinux联盟 |
返回值
| 成功则返回0,失败返回-1,错误原因存于errno。X5yLinux联盟 |
错误代码
| EBADF 参数s不是有效的socket处理代码X5yLinux联盟 ENOTSOCK 参数s为一文件描述词,非socketX5yLinux联盟 ENOTCONN 参数s指定的socket并未连线X5yLinux联盟 |
X5yLinux联盟 | X5yLinux联盟 socket(建立一个socket通信) |
相关函数
| accept,bind,connect,listenX5yLinux联盟 |
表头文件
| #includeX5yLinux联盟 #includeX5yLinux联盟 |
定义函数
| int socket(int domain,int type,int protocol);X5yLinux联盟 |
函数说明
| socket()用来建立一个新的socket,也就是向系统注册,通知系统建立一通信端口。参数domain 指定使用何种的地址类型,完整的定义在/usr/include/bits/socket.h 内,底下是常见的协议:X5yLinux联盟 PF_UNIX/PF_LOCAL/AF_UNIX/AF_LOCAL UNIX 进程通信协议X5yLinux联盟 PF_INET?AF_INET Ipv4网络协议X5yLinux联盟 PF_INET6/AF_INET6 Ipv6 网络协议X5yLinux联盟 PF_IPX/AF_IPX IPX-Novell协议X5yLinux联盟 PF_NETLINK/AF_NETLINK 核心用户接口装置X5yLinux联盟 PF_X25/AF_X25 ITU-T X.25/ISO-8208 协议X5yLinux联盟 PF_AX25/AF_AX25 业余无线AX.25协议X5yLinux联盟 PF_ATMPVC/AF_ATMPVC 存取原始ATM PVCsX5yLinux联盟 PF_APPLETALK/AF_APPLETALK appletalk(DDP)协议X5yLinux联盟 PF_PACKET/AF_PACKET 初级封包接口X5yLinux联盟 |
参数
| type有下列几种数值:X5yLinux联盟 SOCK_STREAM 提供双向连续且可信赖的数据流,即TCP。支持X5yLinux联盟 OOB 机制,在所有数据传送前必须使用connect()来建立连线状态。X5yLinux联盟 SOCK_DGRAM 使用不连续不可信赖的数据包连接X5yLinux联盟 SOCK_SEQPACKET 提供连续可信赖的数据包连接X5yLinux联盟 SOCK_RAW 提供原始网络协议存取X5yLinux联盟 SOCK_RDM 提供可信赖的数据包连接X5yLinux联盟 SOCK_PACKET 提供和网络驱动程序直接通信。X5yLinux联盟 protocol用来指定socket所使用的传输协议编号,通常此参考不用管它,设为0即可。X5yLinux联盟 |
返回值
| 成功则返回socket处理代码,失败返回-1。X5yLinux联盟 |
错误代码
| EPROTONOSUPPORT 参数domain指定的类型不支持参数type或protocol指定的协议X5yLinux联盟 ENFILE 核心内存不足,无法建立新的socket结构X5yLinux联盟 EMFILE 进程文件表溢出,无法再建立新的socketX5yLinux联盟 EACCESS 权限不足,无法建立type或protocol指定的协议X5yLinux联盟 ENOBUFS/ENOMEM 内存不足X5yLinux联盟 EINVAL 参数domain/type/protocol不合法X5yLinux联盟 |
范例
| 参考connect()。 |