1:所需头文件:<systypes.h>(数据类型定义,C语言的一些宏) < sys/socket.h>(提供socket函数和数据结构)
<netinet/in.h>(定义数据结构sockaddr_in) <netdb.h>(提供获取域名或IP的函数)
<arpa/inet.h>(提供IP地址转换函数) <sys/select.h> (提供select函数集相关数据结构的)
2:编写客户端程序
int sock_fd, recvbytes;
char buf[MAXDATASIZE]; // 接受的数据存放的位置
struct hostent *host;
struct sockaddr_in serv_addr
if((host=gethostbyname (argv[1]))==NULL)
{
herror("gethostbyname 出错! ");
exit(1);
}
if ((sock_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
perror("socket 创建出错! ");
exit(1);
}
serv_addr.sin_family=AF_INET;
serv_addr.sin_port=htons(SERVPORT);
serv_addr.sin_addr = *((struct in_addr *)host->h_addr);
bzero(&(serv_addr.sin_zero),8);
if (connect (sock_fd, (struct sockaddr *)&serv_addr, /
sizeof(struct sockaddr)) == -1) {
perror("connect 出错! ");
exit(1);
}
if ((recvbytes=recv(sock_fd, buf, MAXDATASIZE, 0)) ==-1) {
perror("recv 出错! ");
exit(1);
}
buf[recvbytes] = '/0';
printf("Received: %s",buf);
close(sock_fd);
}
int sock_fd,client_fd; /*sock_fd :监听 socket ; client_fd :数据传输 socket */
struct sockaddr_in my_addr; /* 本机地址信息 */
struct sockaddr_in remote_addr; /* 客户端地址信息 */
if ((sock_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("socket 创建出错! ");
exit(1);
}
my_addr.sin_family=AF_INET; // 采用本地地址族
my_addr.sin_port=htons(SERVPORT); // 把端口号转化为网络字节
my_addr.sin_addr.s_addr = INADDR_ANY; // 自动获取本机 IP 地址
bzero(&(my_addr.sin_zero),8); // 填充 0
if (bind(sock_fd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1) {
perror("bind 出错! ");
exit(1);
}
if (listen(sock_fd, BACKLOG) == -1) { // 该函数使得 socket 处于被动监听状态
perror("listen 出错! ");
exit(1);
}
while(1) {
sin_size = sizeof(struct sockaddr_in);
if ((client_fd = accept(sock_fd, (struct sockaddr *)&remote_addr, &sin_size)) == -1) {
perror("accept 出错 ");
continue;
}
printf("received a connection from %s/n", inet_ntoa(remote_addr.sin_addr));
if (!fork()) { /* 子进程代码段 */
if (send(client_fd, "Hello, you are connected!/n", 26, 0) == -1)
perror("send 出错! ");
close(client_fd);
exit(0);
}
close(client_fd);
}
}
return 0;
}
服务器端的代码如下: