服务器端
1、int socket(int domain, int type,int protocol)
domain:说明我们网络程序所在的主机采用的通讯协族(AF_UNIX和AF_INET等).AF_UNIX只能够用于单一的Unix系统进程间通信,而AF_INET是针对Internet的,
type:我们网络程序所采用的通讯协议,SOCK_STREAM表明我们用的是TCP协议,SOCK_DGRAM 表明我们用的是UDP协议,
protocol:由于我们指定了type,所以这个地方我们一般只要用0来代替就可以了
sockfd = socket(AF_INET,SOCK_STREAM, 0)
2、int bind(int sockfd, struct sockaddr *my_addr, int addrlen)
sockfd:是由socket调用返回的文件描述符.
addrlen:是sockaddr结构的长度.
my_addr:是一个指向sockaddr的指针.
中有sockaddr的定义
struct sockaddr_in {
short int sin_family; /* 通信类型 */
unsigned short int sin_port; /* 端口 */
struct in_addr sin_addr; /* Internet 地址 */
unsigned char sin_zero[8]; /* 与sockaddr结构的长度相同*/
};
我们主要使用Internet所以sin_family一般为AF_INET,
sin_addr设置为INADDR_ANY表示可以和任何的主机通信,sin_port是我们要监听的端口号.
sin_zero[8]是用来填充的. bind将本地的端口同socket返回的文件描述符捆绑在一起.
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(portnumber);
3、int listen(int sockfd, int backlog);
sockfd 是调用 socket() 返回的套接字文件描述符。backlog 是在进入 队列中允许的连接数目。
4、int accept(int sockfd, struct sockaddr *addr,int *addrlen)
sockfd:是listen后的文件描述符.
addr, addrlen是用来给客户端的程序填写的,服务器端只要传递指针就可以了.
bind,listen和accept是服务器端用的函数,
accept调用时,服务器端的程序会一直阻塞到有一个 客户程序发出了连接.
accept成功时返回最后的服务器端的文件描述符
new_fd = accept(sockfd, (struct sockaddr *)(&client_addr), &sin_size)
注意:accept的第一个参数为服务器的socket描述字,是服务器开始调用socket()函数生成的,称为监听socket描述字;而accept函数返回的是已连接的socket描述字。一个服务器通常通常仅仅只创建一个监听socket描述字,它在该服务器的生命周期内一直存在。内核为每个由服务器进程接受的客户连接创建了一个已连接socket描述字,当服务器完成了对某个客户的服务,相应的已连接socket描述字就被关闭。
TCP通信模式
客户端
result = connect(sockfd, (struct sockaddr*)&address, len);
//communicate with server socket
while(1)
{
printf("set send content:");
scanf("%c",&ch);
write(sockfd, &ch, 1);
printf("send to server:%c \n",ch);
read(sockfd, &ch, 1);
printf("read from server: %c\n", ch);
}
之后还有关于客户端开启多线程上传数据到服务端,以及服务端开启多线程处理多个客户端的连接与数据通信。暂且不写了。