管理员
论坛积分
分
威望 点
贡献值 个
金币 枚
|
大家好,感谢你的回复。
" z x. b/ W* M% v( |4 {我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。* l$ j$ ?) f* f& d
Talk is cheak , show me the code.
J; J& x& Z: M2 \8 M1 \# T4 b服务端代码:$ \* u4 ~3 B' o" W) h/ \
- #include<stdlib.h>
0 p6 ~2 ^! \; ?+ ]0 \7 {& b - #include<WinSock2.h>
0 I1 x2 m- m8 |0 d& o0 K - #pragma comment(lib,"ws2_32.lib") X4 Z1 D2 X2 E2 p
- int main(){# j7 @: K% J6 g* |
- WSADATA wsd;1 b3 }% \; M) w0 D, W. |9 S$ p
- SOCKET sockServer;% }) \7 |6 b7 _0 h; ?9 Q) f
- SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号5 y; Y$ Y4 d0 X s; V) t: U
- SOCKET sockClient;
) Q: ?8 D; f4 j9 m$ Z5 B& d8 P' } - SOCKADDR_IN clientaddr;! h4 u- v$ j1 E' j! V
- WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
, p, f/ R+ ^: W$ f: L) j% h - sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket8 g) p% ]# _8 y, }: ~8 n8 U! H
8 k4 q( Q2 j" Y9 N' M
+ D: Z Y% j) `4 t3 h- if (sockServer != -1 && sockServer != INVALID_SOCKET){
! K9 ^& K, J N - printf("Socket has been created :%d", sockServer);/ E3 v" O8 @, k7 Z; X
- }1 d# t" r: }; V( Y2 {
- else{3 K) y2 q- w3 C" b" m" k
- printf("Socket create failed.");) h8 O& L8 P6 }( r* J0 _7 Q7 [# ]
- exit(0);
+ b) @5 X, F% d, g - }
9 o9 @4 _) |: O2 |9 n - serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);9 X7 g, p4 n; m, _+ `8 U
- serveraddr.sin_family = AF_INET;
$ w2 c7 ^- v' l" T N" P - serveraddr.sin_port = htons(6000);//绑定端口60009 I/ Y* v8 Q; n- o6 H3 g Z
- int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
% q, |9 G' F2 W$ D1 Z( @ - char recvBuf[100];
! |5 r5 d9 i* C8 H# ?5 C - int len = sizeof(SOCKADDR);/ x' b, H! R8 E
- listen(sockServer, 5);//5为等待连接数2 t1 |( ^1 s- C$ i6 S, m' J2 p+ p$ I7 q
- while (1){
4 @( ^% m* J1 I% Z8 e( X% s - sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);0 t. @% y$ z, ?7 {8 s, @
- //接收客户端数据
8 C4 M% u+ g& V- T. K7 v- K - recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);7 u, N. E7 N# Q3 F7 R
- printf("to me:%s\n",recvBuf);) L( ^7 R Z x9 o& {
- memset(recvBuf, 0, 100);
2 E( f% U; `* b( e+ G; o" o: D; w - } G S0 a) c" H3 `, @- b
- closesocket(sockClient);7 j7 r6 G& a; n8 g
- system("pause");; [! _8 A L$ c
- return 0;/ Z0 z9 Z/ l2 B+ }- u+ `5 ]% b+ Z1 G2 d
- }
复制代码 客户端代码:* j0 U) x( ^( u+ i1 j& }) n7 G; v' ?
- #include<winsock2.h>- C& G; p1 k7 m4 X! L0 d
- #include<stdio.h>
1 C) }% Q7 M: B# L. q( L - #pragma comment(lib, "ws2_32.lib")" L' q3 U5 y! \0 t: y$ g6 y3 G" |
- void main()
' r, Y3 w9 x K8 s - {3 l& v2 J1 Q) N% n% ~) P
- WSADATA wsaData;/ x5 @2 H9 u5 @, e }
- SOCKET sockClient;//客户端Socket
% Y, y X+ r: S% H+ B - SOCKADDR_IN addrServer;//服务端地址! @5 Y2 l3 {+ l% k" f4 z
- WSAStartup(MAKEWORD(2, 2), &wsaData);) l# e0 w6 y+ Q/ }
- char message[20] = "HelloSocket!";
) ^/ z9 o/ N9 F. c) j, A9 s) Q - //定义要连接的服务端地址$ {' \, [ y4 X( o
- addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
. |4 c' h- h& y1 {: g9 P2 v - addrServer.sin_family = AF_INET;. ~$ R0 D r9 A* A
- addrServer.sin_port = htons(6000);//连接端口6000+ n4 ~' k3 k2 m/ V
- //新建客户端socket
+ B% O- R+ n- c- Q+ ^ - sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);3 _8 f( g0 D5 `3 D0 S
- int s = 0;
3 Z9 M$ k; a$ l4 s - s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));9 u6 Q% M- O% I6 h
# @0 }; n# h9 }- while (1){, a; T( L; E0 `2 g) c4 a
- //发送数据5 W+ l( n' \, B
- int a = send(sockClient, message, strlen(message) + 1, 0);
3 w, K8 J5 N" V' m4 e$ U - printf("to server:");# [ [" u+ O1 J1 R
- scanf("%s", message);8 e1 H1 X& c7 i
- E% y* \" s( f3 b% P+ \- }
- q7 `) M& i+ k t - //关闭socket: F. m" j$ D( h( L0 H
- closesocket(sockClient);
5 L# T [/ I+ V% I! [ - WSACleanup();' w7 m [9 J. g1 p( n9 k# \ v2 y% S
- }
复制代码 求懂的高手来解答一下。
, }' U- v+ V0 p% k8 W谢谢了! b. W. T' p, H& ]
0 L( _; } s: e& ?3 g5 C4 A" c+ Y0 Q9 h8 G2 c5 H. }9 S) C* V) z
0 l, v/ \1 [: {( d |
|