管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
大家好,感谢你的回复。( a+ Q; T9 z3 a; I! t9 T1 n
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
; U' A5 L4 `% @ tTalk is cheak , show me the code.
# w `2 t, V' w8 x' X- E服务端代码: y0 ~: W3 I1 @
- #include<stdlib.h>
: E5 a2 v8 d2 O, d0 g% u3 k - #include<WinSock2.h>
) H+ B( K! g0 a1 y( N" e - #pragma comment(lib,"ws2_32.lib")
2 _* ~5 H- @% f - int main(){. P! k. P2 m; J: g' `3 {
- WSADATA wsd;
1 k! V& v' H6 i' K% C9 s- r - SOCKET sockServer;
& ?( j" e9 c+ d8 K$ ]0 z( ` - SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号
& X/ h% ^+ x# r- s - SOCKET sockClient;% g1 K4 S+ d7 |0 z0 x7 ~6 i/ w. ]
- SOCKADDR_IN clientaddr;2 N N* _, ?, O
- WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口6 `# B# d! y0 R7 M
- sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
/ V7 I: B0 P) Q4 C0 d/ C2 q - 8 l( v4 |% L7 }7 F
- : ~; P, B8 c, _2 ]
- if (sockServer != -1 && sockServer != INVALID_SOCKET){
! o0 B$ o9 g3 P7 y - printf("Socket has been created :%d", sockServer);
; Y) m/ H; l1 K - }8 `3 {1 k! _* C
- else{5 Y, H1 `; r/ O% E8 T+ p
- printf("Socket create failed.");
' o/ }- n/ e; J% A/ F; \" i - exit(0);
4 B- o1 {5 c" @; f9 n - }
; E1 Q9 b3 H6 w U, D$ G - serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
$ ^: M: t* N9 b. `* o3 _, u - serveraddr.sin_family = AF_INET;
2 W4 g. |& l- u U2 l6 ?1 c4 X8 u - serveraddr.sin_port = htons(6000);//绑定端口6000
* k' [8 K* f3 G7 a8 _4 M5 G F - int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
% f# R, J! j6 e" J - char recvBuf[100];
* I9 ?4 A+ c3 Q) c p6 [ - int len = sizeof(SOCKADDR);
0 y& P U3 z) U( z# Q+ o6 Y - listen(sockServer, 5);//5为等待连接数
! Z* c. W/ k8 G$ j3 B+ [ - while (1){% [3 B5 F- X7 k( F* x: H% ^2 I
- sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
1 D( R0 T9 i# F - //接收客户端数据
! u' R. B9 B. e+ n! g% b0 C - recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
5 R) a9 y6 g% ?6 }/ G3 m - printf("to me:%s\n",recvBuf);! G) |3 t& M) d* Z
- memset(recvBuf, 0, 100);
, c4 d4 A6 v) Q6 h. }' \: p - }
$ V7 T, A8 j6 S% `/ U& f% g - closesocket(sockClient);# i/ B8 h+ W* |2 i+ c
- system("pause");. n5 v9 d" g6 ]
- return 0;1 K* O/ C0 O2 ^
- }
复制代码 客户端代码:
) a2 V$ a& z1 r+ h2 Y- v- #include<winsock2.h>
& p4 X( y# N2 Z5 M f - #include<stdio.h>
) o. D, Y, E$ m$ M+ I - #pragma comment(lib, "ws2_32.lib")' X* D) t( e" i* L" i1 W
- void main()
5 K. P. A3 @& v5 Y% \( X - {
9 C6 l! Y8 Q5 y" |. K" x - WSADATA wsaData;
7 \% q" Z |* m! J( c- }' l - SOCKET sockClient;//客户端Socket6 q* Z, V1 Z% x7 V* ?6 W7 d
- SOCKADDR_IN addrServer;//服务端地址
8 L- o& X4 M' S( s; W3 I - WSAStartup(MAKEWORD(2, 2), &wsaData);
2 J6 }, S) i h4 b6 } - char message[20] = "HelloSocket!";8 s j6 }- d$ {3 N
- //定义要连接的服务端地址
3 d# l- T& [' C, H1 U! q% ^: q - addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)2 _7 i; g/ J% a1 a7 M' i
- addrServer.sin_family = AF_INET;
a9 M/ M0 ]! R5 B5 a$ ]( W$ g! U - addrServer.sin_port = htons(6000);//连接端口6000+ V+ [# N5 ^6 ]- g$ G
- //新建客户端socket
H0 D/ t# E3 i - sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);* I2 S! s/ X$ ]; m x9 x/ d
- int s = 0;
% O) I/ {% U8 |7 {/ A/ g: |! M3 e - s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));1 O4 |% H: U6 o' m' x& v
- ' P ^2 ]/ q7 x/ O! H" h t. t
- while (1){
$ \9 \7 s, F$ ~! F( q( t5 D - //发送数据
! g* _8 t9 L- k+ f& x2 [; e$ } - int a = send(sockClient, message, strlen(message) + 1, 0);/ l, m5 m- S) B( }0 y p, i! w
- printf("to server:");
* F0 N# V1 g1 ]! A7 m! } - scanf("%s", message); A7 D' h6 M# J8 n' D+ o0 Z
3 M0 V" X/ u# X7 ~0 p- }$ b D% K4 K( \9 h7 U
- //关闭socket; `! c6 F g$ {
- closesocket(sockClient);# H- @& Z, V( l" a7 i* {3 {
- WSACleanup();
; W L* s% U5 r4 z8 o/ | - }
复制代码 求懂的高手来解答一下。& X6 B8 ?- {* ]) r. O
谢谢了!8 |8 V9 s% ~ B: N. W
. w" t3 I# ]8 U8 ]1 Z, v6 c( o& V7 w9 m7 Y3 }7 t
% Q* E0 S0 F' `; X* c1 ?- C% ^
|
|