BSDSocket编程之TCP
TCPClient
1 /*TCP/IP应用编程接口(API)*/
2 /*
3 *客户端的工作流程:首先调用socket函数创建一个Socket,然后调用bind函数
4 *将其与本机地址以及一个本地端口号绑定,请求连接服务器,通过新的socket
5 *向客户端发送字符串" hi,I am client!"。最后关闭该socket。
6 */
7 #include<stdio.h>
8 #include<stdlib.h>
9 #include<string.h>
10 #include<errno.h>
11 #include<sys/types.h>
12 #include<sys/socket.h>
13 #include<netinet/in.h>
14
15 int main()
16 {
17 int cli_sockfd;/*客户端SOCKET */
18 int addrlen;
19 char seraddr[14];
20 struct sockaddr_in ser_addr,/* 服务器的地址*/
21 cli_addr;/* 客户端的地址*/
22 char msg[MAX_MSG_SIZE];/* 缓冲区*/
23 GetServerAddr(seraddr);
24 cli_sockfd=socket(AF_INET,SOCK_STREAM,0);/*创建连接的SOCKET */
25 if(ser_sockfd<0)
26 {/*创建失败 */
27 fprintf(stderr,"socker Error:%s\n",strerror(errno));
28 exit(1);
29 }
30 /* 初始化客户端地址*/
31 addrlen=sizeof(struct sockaddr_in);
32 bzero(&ser_addr,addrlen);
33 cli_addr.sin_family=AF_INET;
34 cli_addr.sin_addr.s_addr=htonl(INADDR_ANY);
35 cli_addr.sin_port=0;
36 if(bind(cli_sockfd,(struct sockaddr*)&cli_addr,addrlen)<0)
37 {
38 /*棒定失败 */
39 fprintf(stderr,"Bind Error:%s\n",strerror(errno));
40 exit(1);
41 }
42 /* 初始化服务器地址*/
43 addrlen=sizeof(struct sockaddr_in);
44 bzero(&ser_addr,addrlen);
45 ser_addr.sin_family=AF_INET;
46 ser_addr.sin_addr.s_addr=inet_addr(seraddr);
47 ser_addr.sin_port=htons(SERVER_PORT);
48 if(connect(cli_sockfd,(struct sockaddr*)&ser_addr,&addrlen)!=0)/*请求连接*/
49 {
50 /*连接失败 */
51 fprintf(stderr,"Connect Error:%s\n",strerror(errno));
52 close(cli_sockfd);
53 exit(1);
54 }
55 strcpy(msg,"hi,I am client!");
56 send(sockfd,msg,sizeof(msg),0);/*发送数据*/
57 recv(sockfd,msg,MAX_MSG_SIZE,0); /* 接受数据*/
58 printf("%s\n",msg);/*在屏幕上打印出来 */
59 close(cli_sockfd);
60
61 return 0;
62 }
TCPServer
/*TCP/IP应用编程接口(API)*/
/*
*服务器的工作流程:首先调用socket函数创建一个Socket,然后调用bind函数将其与本机地址以及
*一个本地端口号绑定,然后调用listen在相应的socket上*,当accpet接收到一个连接服务请求时,
*将生成一个新的socket。服务器显示该客户机的IP地址,并通过新的socket向客户端发送字符串
*" hi,I am SERver!"。最后关闭该socket。
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
int main()
{
int sock_fd,client_fd; /*sock_fd:*socket;client_fd:数据传输socket */
struct sockaddr_in ser_addr; /* 本机地址信息 */
struct sockaddr_in cli_addr; /* 客户端地址信息 */
char msg[MAX_MSG_SIZE];/* 缓冲区*/
ser_sockfd=socket(AF_INET,SOCK_STREAM,0);/*创建连接的SOCKET */
if(ser_sockfd<0)
{/*创建失败 */
fprintf(stderr,"socker Error:%s\n",strerror(errno));
exit(1);
}
/* 初始化服务器地址*/
addrlen=sizeof(struct sockaddr_in);
bzero(&ser_addr,addrlen);
ser_addr.sin_family=AF_INET;
ser_addr.sin_addr.s_addr=htonl(INADDR_ANY);
ser_addr.sin_port=htons(SERVER_PORT);
if(bind(ser_sockfd,(struct sockaddr*)&ser_addr,sizeof(struct sockaddr_in))<0)
{ /*绑定失败 */
fprintf(stderr,"Bind Error:%s\n",strerror(errno));
exit(1);
}
/*侦听客户端请求*/
if(listen(ser_sockfd,BACKLOG)<0)
{
fprintf(stderr,"Listen Error:%s\n",strerror(errno));
close(ser_sockfd);
exit(1);
}
while(1)
{/* 等待接收客户连接请求*/
cli_sockfd=accept(ser_sockfd,(struct sockaddr*) & cli_addr,&addrlen);
if(cli_sockfd<=0)
{
fprintf(stderr,"Accept Error:%s\n",strerror(errno));
}
else
{/*开始服务*/
recv(cli_addr,msg,MAX_MSG_SIZE,0); /* 接受数据*/
printf("received a connection from %sn", inet_ntoa(cli_addr.sin_addr));
printf("%s\n",msg);/*在屏幕上打印出来 */
strcpy(msg,"hi,I am server!");
send(cli_addr,msg,sizeof(msg),0); /*发送的数据*/
close(cli_addr);
}
}
close(ser_sockfd);
}