管理员
论坛积分
分
威望 点
贡献值 个
金币 枚
|
大家好,感谢你的回复。
1 z5 Z0 R3 E! d$ J3 B7 J, N我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
& o, w, q3 d8 t7 S) L. h8 F- wTalk is cheak , show me the code.' H; _1 B% D7 A f* l3 F9 M
服务端代码:
1 ~" w5 l% \: a) H2 X5 {, F5 Z1 q- #include<stdlib.h>
( w4 h! h: R! w/ s1 K! W - #include<WinSock2.h>
1 G- g3 a. Z9 U% c( x7 r( e/ q$ D - #pragma comment(lib,"ws2_32.lib")) D7 A4 e; F: W+ x
- int main(){; I$ E m, e' E8 c/ `2 u; t
- WSADATA wsd;
1 h2 l' M; }, S5 R: k0 I! w - SOCKET sockServer;
. K$ p: B' o' ^# r* x - SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号
3 [4 s, S7 t( _) Y Z+ m - SOCKET sockClient;2 t# o- }' c9 U
- SOCKADDR_IN clientaddr;; b9 \; ]5 o0 g; m
- WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口1 K. \& f/ y0 J* T0 ?0 Q q/ A* w
- sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
' ]" ?/ s$ C$ ^9 m3 u
. @5 f+ ]/ e5 a$ Q9 x# ~6 S
2 m3 @; N2 [4 z* C- if (sockServer != -1 && sockServer != INVALID_SOCKET){. A/ N! r9 p8 C1 o" U7 z
- printf("Socket has been created :%d", sockServer);. I5 V( ~+ D: e; T# x
- }
% A. L9 U& x& {1 E d5 ] - else{" |8 A0 i. M- f) U7 C
- printf("Socket create failed.");
8 q7 B; c/ R M& @; s - exit(0);
# _+ m/ m2 o, S: d4 ? - }
. A9 Z* C6 z0 N8 Q/ l/ D, v - serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
3 m' N4 U5 p- z6 Z - serveraddr.sin_family = AF_INET;
/ G; F5 M& v2 d9 d* T- {" g* | - serveraddr.sin_port = htons(6000);//绑定端口6000$ b- l9 D' |/ v B
- int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
& ?* q0 p6 A7 I; g" T; n - char recvBuf[100];
* y0 f" |5 B" H/ ^ - int len = sizeof(SOCKADDR);
. Q4 C5 V& M+ v7 Y: } - listen(sockServer, 5);//5为等待连接数
$ f4 p3 p( b; x8 F' E - while (1){
( V* @2 a8 f% @; Q+ A - sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
8 [1 d, i7 o: `0 Z% W8 P - //接收客户端数据6 `% g) e, O* s% i# m) I# W
- recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);" b. V, k! T' P" c* T: \! h' ]3 n
- printf("to me:%s\n",recvBuf);( r2 s& I9 d9 R9 n P
- memset(recvBuf, 0, 100);4 Q& s2 K8 M* j" \. L
- }) w ~2 g9 r# G5 _4 H5 A: b% |) v* c
- closesocket(sockClient);% x/ _! m) w( L7 y2 C
- system("pause");, g: @: ?" o7 K7 U, y( u
- return 0;+ I- p, }$ l7 w2 t1 t$ x! p
- }
复制代码 客户端代码:0 Z" a$ E5 k7 ~0 e. W: M# {3 i& E: }- ^) D
- #include<winsock2.h>, A$ G, b% ^/ z
- #include<stdio.h>
& C* W. i9 K- z! d5 M( M: D - #pragma comment(lib, "ws2_32.lib")
/ y( B$ X+ N0 K - void main()
! ^' X1 c! z6 h/ D3 n - {
+ U' E" }$ K% c# n% u! y9 ^8 ] - WSADATA wsaData;% L' t! c/ t# P
- SOCKET sockClient;//客户端Socket
9 V! [, @2 m, b1 Y. Z- J1 Q) k( t - SOCKADDR_IN addrServer;//服务端地址( _: i4 ^, j. i( ~" X
- WSAStartup(MAKEWORD(2, 2), &wsaData);. H1 [7 |. M% R+ u
- char message[20] = "HelloSocket!";$ t$ F5 h% ]8 u
- //定义要连接的服务端地址* R& z9 J8 q# {' g" E* B4 c( k4 t
- addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)& }# ]- {1 Y0 m4 h7 @
- addrServer.sin_family = AF_INET;* A: e0 u" ?) X; h: g7 c# t
- addrServer.sin_port = htons(6000);//连接端口6000
& ^+ _/ P7 G9 B5 [' Y2 { - //新建客户端socket/ a# T2 s* J8 u& {8 I1 @
- sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);- D% m6 {2 o3 b1 b0 x/ {
- int s = 0;
" ]+ R9 w3 v, \. R3 X; ` - s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));& x* U/ B% h! ]5 X
- " \* C! H% _5 l& G- b; L8 u
- while (1){
. z o, g; P" \5 S/ M) y9 E - //发送数据
2 D: L, c" V3 M1 Y* \$ P! t - int a = send(sockClient, message, strlen(message) + 1, 0);1 N a4 W% F+ d( U1 o
- printf("to server:");
~( M# ?' n4 [) @9 q4 ] - scanf("%s", message);8 }8 N& Y+ [' h5 m& S
- 9 s- v5 `# z0 E5 O
- } i/ h4 y# `8 t, ?$ Y
- //关闭socket
" S/ N. H3 Q) ^$ W1 `* J' W5 r5 ^! g - closesocket(sockClient);% u9 F4 T! {% e. i
- WSACleanup();
; r R1 ~0 t$ L+ h8 U& b - }
复制代码 求懂的高手来解答一下。( t2 L: m' z6 {$ b
谢谢了!
! A3 q x4 U9 s; v2 k$ }1 d! t4 J6 f8 b! y& w+ z
7 \/ [% O$ C1 @: K0 k
9 ^/ R$ V8 X* r" }+ O4 P |
|