网络通信
基于TCP协议
TCP:Transmission Control Protocol 传输控制协议TCP是一种面向连接(连接导向)的、可靠的、基于字节流的运输层(Transport layer)通信协议,由IETF的RFC 793说明(specified)。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能,UDP是同一层内另一个重要的传输协议。
服务器
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <errno.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/wait.h>
void errexit(const char *text){
perror(text);
exit(-1);
}
bool run = true;
void sigexit(int sig){
run = false;
}
int main(int argc,char *argv[]){
if(argc < 3){
printf("%s ip port\n",argv[0]);
return -1;
}
printf("1.创建socket套接字.\n");
int sockfd = socket(AF_INET,SOCK_STREAM,0);
if(sockfd == -1)
errexit("socket");
printf("2.准备物理通信地址.\n");
struct sockaddr_in addr = {
}; //网络的通信地址类型
addr.sin_family = AF_INET; //地址族和socket创建时第一个参数一样
//htons 把一个short类型从本地字节序转换为网络字节序
addr.sin_port = htons(atoi(argv[2])); //端口 home to internet s short
//inet_addr 可以把一个点分十进制的ip地址 转换为 s_addr_t类型的ip
addr.sin_addr.s_addr = inet_addr(argv[1]); //IP地址
socklen_t len = sizeof(addr);
printf("3.socket绑定物理地址.\n");
int ret = bind(sockfd,(const struct sockaddr*)&addr,len);
if(ret == -1)
errexit("bind");
printf("4.监听.\n");
ret = listen(sockfd,5);
if(ret == -1)
errexit("listen");
printf("5.等待客户端连接.\n");
//不循环等待 只让一个客户端连接
struct sockaddr_in caddr;//用于接收客户端的物理地址
socklen_t clen = sizeof(caddr);
int cfd