C语言基础知识 ---------- 网络编程(Socket、多线程(thread))

先总结下socket创建流程:

  • 服务端:
    • 创建套接字(socket):int Ser_socket = socket(AF_INET, SOCK_STREAM, 0);
    • 绑定套接字(bind):int resp = bind(Ser_socket, (struct sockaddr *)&addr, sizeof(addr)); addr 为服务端地址结构变量(sockaddr_in)。
    • 将套接字设为监听,准备接收客户请求(listen) :int lresp = listen(Ser_socket, 20); 20为连接上限。
    • 等待客户请求的到来,当请求到来后,接受请求,返回一个对应于此次连接的套接字(accept):int client_socket = accept(Ser_socket, (struct sockaddr *)&cliaddr, &addrlen);   cliaddr 接收到的客户端的地址。
    • 用返回的套接字client_socket与客户端进行通信(read/write):read(client_socket, buf, SIZE-1); buf 为容器,SIZE-1为接收数据大小。
    • 关闭套接字:close(Ser_socket);
  • 客户端:
    • 创建套接字(socket):int Cli_socket = socket(AF_INET, SOCK_STREAM, 0);
    • 向服务器发出连接请求(connect):int Conn_socket =  connect(Cli_sockett,  (struct sockaddr *)&addr, addrlen); addr 为客户端地址结构变量(sockaddr_in)。
    • 通过套接字Cli_socket 和服务器端进行通信(read/write):write(Cli_socket ,cmd,strlen(cmd)); cmd 为数据,strlen(cmd)为数据大小。
    • 关闭套接字:close(Conn_socket); 

服务器端调用accept函数后,程序就会等待客户端调用connect函数发出连接请求,接收到客户请求,于是双方就建立了连接。之后,服务器端和客户端就可以利用read和write函数进行通信了。

单客户服务器:

main()
{
int Ser_socket = socket(AF_INET, SOCK_STREAM, 0);   //创建一个负责监听的套接字
struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr)); //initialize addr
    addr.sin_family = AF_INET;  /* Internet地址族 */
    addr.sin_port = htons(9990);  /* 端口号,随意 */
    addr.sin_addr.s_addr = htonl(INADDR_ANY);   /* IP地址 */
int resp = bind(Ser_socket , (struct sockaddr *)&addr, sizeof(addr));  //连接
int lresp = listen(Ser_socket , 20);   
 
while(1){
    struct sockaddr_in cliaddr;
    int client_socket = accept(Ser_socket , (struct sockaddr *)&cliaddr , sizeof(cliaddr));   
        char cmd[1024];
	int ret = read(client_socket, cmd, 1023);
	cmd[ret]='\0';   
//处理指令;
    if(strcmp(cmd,"quit") == 0){
        break; 
    }
    }
close(Ser_socket );
}

多客户服务器(进程):

main()
{
int Ser_socket = socket(AF_INET, SOCK_STREAM, 0);   //创建一个负责监听的套接字
struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr)); //initialize addr
    addr.sin_family = AF_INET;  /* Internet地址族 */
    addr.sin_port = htons(9990);  /* 端口号,随意 */
    addr.sin_addr.s_addr = htonl(INADDR_ANY);   /* IP地址 */
int resp = bind(Ser_socket , (struct sockaddr *)&addr, sizeof(addr));  //连接
int lresp = listen(Ser_socket , 20);    

while(1){
struct sockaddr_in cliaddr;
int client_socket = accept(Ser_socket , (struct sockaddr *)&cliaddr , sizeof(cliaddr));
	int pid = fork();
	if(pid == -1){
		break;
	}
	if(pid > 0){			
//父进程一开始就要把父进程的接收函数关闭掉,防止父进程在接收函数处阻塞,导致子进程不能创建成功.
		close(client_socket);			
		continue;		
	}		
	if(pid == 0){
//子进程在一创建就要把监听函数关闭,不然会导致服务器功能的紊乱。
		close(Ser_socket);
		char cmd[1024];
		int ret = read(client_socket, cmd, 1023);
	        cmd[ret]='\0';
        //子进程收到客户端指令。
        //xxxxxxxx处理指令
	    break;
	}
	close(Ser_socket );
}

多客户服务器(线程):#include

main()
{
int Ser_socket = socket(AF_INET, SOCK_STREAM, 0);   //创建一个负责监听的套接字
struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr)); //initialize addr
    addr.sin_family = AF_INET;  /* Internet地址族 */
    addr.sin_port = htons(9990);  /* 端口号,随意 */
    addr.sin_addr.s_addr = htonl(INADDR_ANY);   /* IP地址 */
int resp = bind(Ser_socket , (struct sockaddr *)&addr, sizeof(addr));  //连接
int lresp = listen(Ser_socket , 20);    

while(1){
struct sockaddr_in cliaddr;
int client_socket = accept(Ser_socket , (struct sockaddr *)&cliaddr , sizeof(cliaddr));
	pthread_t id;	
//clientMethod为此线程客户端,要执行的程序。
        pthread_create(&id, NULL, (void *)clientMethod, (void *)client_socket);
//要将id分配出去。
        pthread_detach(id);
}
	close(Ser_socket );
}

客户端:

main()
{
int Cli_socket = socket(AF_INET, SOCK_STREAM, 0);   //创建和服务器连接套接字
struct sockaddr_in addr;
	memset(&addr, 0, sizeof(addr));//initialize clear 0
	addr.sin_family = AF_INET;  /* Internet地址族 */
 	addr.sin_port = htons(9990);  /* 端口号 */
   	addr.sin_addr.s_addr = htonl(INADDR_ANY);   /* IP地址 */
	inet_aton("127.0.0.1", &(addr.sin_addr));
int addrlen = sizeof(addr);
int Conn_socket =  connect(Cli_socket , (struct sockaddr *)&addr, addrlen);  //连接服务器

    char cmd[1024];
	int end = 0;
	while(1)        //向服务器发送数据
	{
		if(end == 1)  break;
		memset(cmd, 0, sizeof(cmd));
    	        printf("please input command:\n");
   		gets(cmd);
                if(strcmp(cmd,"quit") == 0 ){
                    end = 1;
                }else{
		    write(Cli_socket ,cmd,strlen(cmd));
                }
	}

	close(Conn_socket );
}

 

 

仅为个人理解,如有不足,请指教。 https://blog.csdn.net/weixin_35811044

你可能感兴趣的:(编程语言)