分析一个socket通信: server/client1
server
1. 创建一个server_socket文件,并绑定端口,然后监听端口 (socket, bind, listen)
2. 查询该端口是否有客户端的连接:
while(1)
{
查询这个端口是否有来自client的消息;(accept)// accept: input is server_socket_fd ; ret value is client_socket_fd
如果有,返回client_socket_fd, 并把消息读出来 (rcv from client_socket_fd); 当然这个时候server也可以send to client_socket.
}
client
1. 创建一个client_socket文件,绑定端口和server ip,然后通过这个socket去和server的socket连接起来 (socket, connect);
2. 连接成功后,client往client_socket写东西(send to client_socket_fd). 当然这个时候client也可以rcv from client_socket.
client_socket文件的作用是client和server之间的一个通信管道。
debug代码:
//client: #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <fcntl.h> #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <errno.h> #define N 128 typedef struct sockaddr SA; extern void show_time(void); int main(int argc, char *argv[]) { int sockfd, fd, nbyte; char command[32]; struct sockaddr_in server_addr; if (argc < 3) { printf("Usage : %s <server_ip> : <port> ", argv[0]); exit(-1); } memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = PF_INET; server_addr.sin_port = htons(atoi(argv[2])); server_addr.sin_addr.s_addr = inet_addr(argv[1]); while ( 1 ) { printf("<client> "); fgets(command, 32, stdin); command[strlen(command)-1] = '