TCP Socket编程示例

TCP_Server

 1 #include <winsock2.h> 
 2 #include <stdio.h> 
 3 #include <windows.h> 
 4 #pragma comment(lib,"ws2_32.lib") 
 5 
 6 int main(int argc, char* argv[])
 7 { 
 8  //判断是否输入了端口号 
 9  if(argc!=2)
10  { 
11   printf("Usage: %s PortNumber\n",argv[0]); 
12   exit(-1); 
13  } 
14 
15  //把端口号转化成整数 
16  short port; 
17  if((port = ato(argv[1]))==0)
18  { 
19   printf("端口号有误!"); 
20   exit(-1); 
21  } 
22  WSADATA wsa; 
23  //初始化套接字DLL 
24  if(WSAStartup(MAKEWORD(2,2),&wsa)!=0)
25  { 
26   printf("套接字初始化失败!"); 
27   exit(-1); 
28  } 
29  //创建套接字 
30  SOCKET serverSocket; 
31  if((serverSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==INVALID_SOCKET)
32  { 
33   printf("创建套接字失败!"); 
34   exit(-1); 
35  } 
36 
37  struct sockaddr_in serverAddress; 
38  memset(&serverAddress,0,sizeof(sockaddr_in)); 
39  serverAddress.sin_family=AF_INET; 
40  serverAddress.sin_addr.S_un.S_addr = htonl(INADDR_ANY); 
41  serverAddress.sin_port = htons(port); 
42  //绑定 
43  if(bind(serverSocket,(sockaddr*)&serverAddress,sizeof(serverAddress))==SOCKET_ERROR)
44  { 
45   printf("套接字绑定到端口失败!端口: %d\n",port); 
46   exit(-1); 
47  } 
48  //进入侦听状态 
49  if(listen(serverSocket,SOMAXCONN)==SOCKET_ERROR)
50  { 
51   printf("侦听失败!"); 
52   exit(-1); 
53  } 
54  printf("Server %d is listening......\n",port); 
55  SOCKET clientSocket;//用来和客户端通信的套接字 
56  struct sockaddr_in clientAddress;//用来和客户端通信的套接字地址 
57  memset(&clientAddress,0,sizeof(clientAddress)); 
58  int addrlen = sizeof(clientAddress); 
59  //接受连接 
60  if((clientSocket=accept(serverSocket,(sockaddr*)&clientAddress,&addrlen))==INVALID_SOCKET)
61  { 
62   printf("接受客户端连接失败!"); 
63   exit(-1); 
64  } 
65  printf("Accept connection from %s\n",inet_ntoa(clientAddress.sin_addr)); 
66  char buf[4096]; 
67  while(1)
68  { 
69   //接收数据 
70   int bytes; 
71   if((bytes=recv(clientSocket,buf,sizeof(buf),0))==SOCKET_ERROR)
72   { 
73    printf("接收数据失败!\n"); 
74    exit(-1); 
75   } 
76   buf[bytes]='\0'; 
77   printf("Message from %s: %s\n",inet_ntoa(clientAddress.sin_addr),buf); 
78   if(send(clientSocket,buf,bytes,0)==SOCKET_ERROR)
79   { 
80    printf("发送数据失败!"); 
81    exit(-1); 
82   } 
83 
84  } 
85  //清理套接字占用的资源 
86  WSACleanup(); 
87  return 0; 
88 } 

TCP_Client

 1 #include <winsock2.h> 
 2 #include <stdio.h> 
 3 #include <windows.h> 
 4 #include <stdlib.h>
 5 #pragma comment(lib,"ws2_32.lib") 
 6 
 7 int main(int argc, char* argv[])
 8 { 
 9  //判断是否输入了IP地址和端口号 
10  if(argc!=3)
11  { 
12   printf("Usage: %s IPAddress PortNumber\n",argv[0]); 
13   exit(-1); 
14  } 
15  //把字符串的IP地址转化为u_long 
16  unsigned long ip; 
17  if((ip=inet_addr(argv[1]))==INADDR_NONE)
18  { 
19   printf("不合法的IP地址:%s",argv[1]); 
20   exit(-1); 
21  } 
22  //把端口号转化成整数 
23  short port; 
24  if((port = atoi(argv[2]))==0)
25  { 
26   printf("端口号有误!"); 
27   exit(-1); 
28  } 
29  printf("Connecting to %s:%d......\n",inet_ntoa(*(in_addr*)&ip),port); 
30  WSADATA wsa; 
31  //初始化套接字DLL 
32  if(WSAStartup(MAKEWORD(2,2),&wsa)!=0)
33  { 
34   printf("套接字初始化失败!"); 
35   exit(-1); 
36  } 
37  //创建套接字 
38  SOCKET sock; 
39  if((sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==INVALID_SOCKET)//创建数据流用于TCP
40  { 
41   printf("创建套接字失败!"); 
42   exit(-1); 
43  } 
44  struct sockaddr_in serverAddress; 
45  memset(&serverAddress,0,sizeof(sockaddr_in)); 
46  serverAddress.sin_family=AF_INET; 
47  serverAddress.sin_addr.S_un.S_addr = ip; 
48  serverAddress.sin_port = htons(port); 
49  //建立和服务器的连接 
50  if(connect(sock,(sockaddr*)&serverAddress,sizeof(serverAddress))==SOCKET_ERROR)
51  { 
52   printf("建立连接失败!"); 
53   exit(-1); 
54  } 
55  char buf[4096]; 
56  while(1)
57  { 
58   printf(">"); 
59   //从控制台读取一行数据 
60   gets(buf); 
61   //发送给服务器 
62   if(send(sock,buf,strlen(buf),0)==SOCKET_ERROR)
63   { 
64    printf("发送数据失败!"); 
65    exit(-1); 
66   } 
67   int bytes; 
68   if((bytes=recv(sock,buf,sizeof(buf),0))==SOCKET_ERROR)
69   { 
70    printf("接收数据失败!\n"); 
71    exit(-1); 
72   } 
73   buf[bytes]='\0'; 
74   printf("Message from %s: %s\n",inet_ntoa(serverAddress.sin_addr),buf); 
75 
76  } 
77  //清理套接字占用的资源 
78  WSACleanup();
79  system("pause");
80  return 0; 
81 
82 }


 


 

posted @ 2012-09-28 14:43  dacy  阅读(268)  评论(0编辑  收藏  举报