【说明】
1)select用法2)udp客户端bind用法
tcp客户端调用bind是没有任何意义的,因为connect中已包括bind客户端地址和端口的操作,即使执行bind也会被connect覆盖。
udp客户端可以通过bind绑定本地地址和端口,其中,注意绑定 INADDR_ANY 地址 和 0 端口的用法。
分别代表由内核分配地址和端口,效果相当于未调用bind函数。
3)recvfrom函数中 &addrlen 参数
不能传入未初始化的值,否则,sendto发送响应消息时会报“Address family not supported by protocol”错误。
4)socket创建后,系统是否会自动回收
若不主动调用close关闭socket,(客户端/服务器端)系统不会主动回收socket,除非某些服务器的应用程序会做超时断开处理。
5)udp的客户端/服务端概念比较模糊,实际上是对等的,只要看哪一端IP固定且可见
客户端可以通过检查发送方的地址和端口来判断响应是否来自服务器。
【示例:Server】
/* udp server */
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#define DEFAULT_PORT 8888
#define BUFLEN 512
int main(int argc, char** argv)
{
fd_set readfds;
struct sockaddr_in servaddr, clientaddr;
char buff[BUFLEN] = {0};
char responder[] = "Hi,server has received packets!\n";
int socket_fd = 0, relt = 0;
int addrlen = sizeof(struct sockaddr);
//创建Socket
if( (socket_fd = socket(AF_INET, SOCK_DGRAM, 0)) == -1 ){
printf