套接口描述符使用 sockaddr_in 数据结构,有了套接口之后需要调用bind()函数把套接口绑定到本地计算机的一个接口上,使用inet_addr()函数将普遍形式的IP地址转化为无符号的整型数,调用socket()函数获得文件描述符。程序分为客户端和服务端。应用select函数来实现异步的读写操作。在服务器端:首先先创建套接字,然后绑定,接下进入一个无限循环,用accept函数,接受“连接”请求,然后调用创建线程函数,创造新的线程,进入下一个循环。这样每当有一个新的“连接”被接受都会创建一个新的线程。
服务器端程序如下:
//server.c
View Code
1 //server.c
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <errno.h>
5 #include <string.h>
6 #include <sys/types.h>
7 #include <netinet/in.h>
8 #include <sys/socket.h>
9 #include <sys/wait.h>
10 #include <unistd.h>
11 #include <arpa/inet.h>
12 #include <sys/time.h>
13 #include <sys/types.h>
14
15 #define MAXBUF 1024
16
17
18 int main(int argc, char **argv)
19 {
20 int sockfd, new_fd;
21 socklen_t len;
22 struct sockaddr_in my_addr, their_addr;
23 unsigned int myport, lisnum;
24 char buf[MAXBUF + 1];
25 fd_set rfds;
26 struct timeval tv;
27 int retval, maxfd = -1;
28
29 if (argv[1])
30 myport = atoi(argv[1]);
31 else
32 myport = 7838;
33
34 if (argv[2])
35 lisnum = atoi(argv[2]);
36 else
37 lisnum = 2;
38
39 if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1)
40 {
41 perror("socket");
42 exit(1);
43 }
44
45 bzero(&my_addr, sizeof(my_addr));
46 my_addr.sin_family = PF_INET;
47 my_addr.sin_port = htons(myport);
48 if (argv[3])
49 my_addr.sin_addr.s_addr = inet_addr(argv[3]);
50 else
51 my_addr.sin_addr.s_addr = INADDR_ANY;
52
53 if (bind(sockfd, (struct sockaddr *) &my_addr, sizeof(struct sockaddr))
54 == -1) {
55 perror("bind");
56 exit(1);
57 }
58
59 if<