管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
大家好,感谢你的回复。
6 Q1 ]( [/ \5 ^2 W; S5 j我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
8 A5 D6 }; {- \ b2 b- e3 `Talk is cheak , show me the code.9 r/ h& L$ |& X/ g# }7 Z1 z
服务端代码:- S$ t" l* g7 L( \
- #include<stdlib.h>
9 h* x0 @+ o! E6 Y4 } - #include<WinSock2.h>
( p' C- y. v+ Y" }. a( t; ~- M, @ - #pragma comment(lib,"ws2_32.lib")
- J& y, i% Y4 N2 K* n8 [ - int main(){/ C2 ] \. O; z
- WSADATA wsd; r$ [) d- N, c# B. x; _5 E3 U O0 o
- SOCKET sockServer; V" s4 Y, n7 s# @* W
- SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号
) S1 W) n) v: d9 [/ P - SOCKET sockClient;5 S% _- C8 \1 f6 G
- SOCKADDR_IN clientaddr;
( P. e; g; A+ {) w8 D& k+ w - WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口) s) r+ R1 s H) d' A: f3 g l& Q
- sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket; c( `) o7 n0 j: x* p, }( H
- $ q! N* v& }- v& G0 O8 a" ^8 F
- , s- ~% n; p! I/ ~! m
- if (sockServer != -1 && sockServer != INVALID_SOCKET){* u) P3 i8 f- u6 I3 J {
- printf("Socket has been created :%d", sockServer);) P# D ?5 E/ G* n
- }
- X9 Q( a9 j3 J/ R3 q/ t - else{9 i5 B4 B+ F6 X* i1 n0 Y% j$ M
- printf("Socket create failed.");
! q4 Y! t# u4 p' ~/ m8 d - exit(0);4 I. J0 G! B' i( s1 s
- }
% w6 k8 H! h2 ?& e - serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
5 |' X" k+ k) O5 p4 w& }- F - serveraddr.sin_family = AF_INET;( v5 D2 Y7 z) ]! b% I! L8 P
- serveraddr.sin_port = htons(6000);//绑定端口6000! c+ E! J* X7 T0 i0 X$ z! B1 Y, B
- int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));" J K/ Y) ~7 q x6 F- F
- char recvBuf[100];
+ X- }8 k& Z2 E - int len = sizeof(SOCKADDR);% ~2 N3 x2 n* H" _) |
- listen(sockServer, 5);//5为等待连接数) M1 g: x7 \* Q# A
- while (1){# v, v5 m2 }: t. V. y0 O
- sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
* y/ D8 F: {7 D1 } - //接收客户端数据
+ n" L2 X9 y8 O+ j0 u, h - recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);$ E) X$ |% V8 ]# H; d, S: i0 w$ Y
- printf("to me:%s\n",recvBuf);9 M- ?+ c: [ M, s
- memset(recvBuf, 0, 100);
8 U# n, u$ w2 v) G - }+ P* T9 O9 Z+ f k5 I& q( R
- closesocket(sockClient);7 _" m; p+ e U5 |9 w+ A. ^
- system("pause");
6 Z' z8 p: i0 `2 y" P8 ~# H - return 0;
( P0 F3 e$ P& c: x6 a - }
复制代码 客户端代码:( j) c/ R3 y) }7 g! i
- #include<winsock2.h>9 N6 H! f" ]5 d" _8 J1 p ?) I
- #include<stdio.h>
3 L( r9 e5 K9 Z0 D1 J - #pragma comment(lib, "ws2_32.lib")# [' A% ~% A( T. A& B$ G
- void main()
0 k5 K# N3 B$ o o - {1 |! A& Q' y' Q2 U) B, P$ Y! J3 K* N
- WSADATA wsaData;
% @6 K" V O& N - SOCKET sockClient;//客户端Socket9 I/ n% ^. |/ ?! I- O! ~) ?, _ C
- SOCKADDR_IN addrServer;//服务端地址
/ H! j$ q* k% W, z - WSAStartup(MAKEWORD(2, 2), &wsaData);
( q& r: W2 C: m2 o9 c# \ - char message[20] = "HelloSocket!";" }! p1 L8 ?0 p# s) c' L X: g8 Q
- //定义要连接的服务端地址
, `4 Z" o, j0 t5 ]4 K& z - addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)" v3 ], ^% J( ^) j, P4 s4 }- u
- addrServer.sin_family = AF_INET;
, f* c/ U# Z6 t1 o% ]: W - addrServer.sin_port = htons(6000);//连接端口6000
+ M8 [4 r# U: q* O( d0 L - //新建客户端socket
& y; E3 c F+ x( T - sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
8 \- ~! f/ E9 a' P - int s = 0;
7 t# d0 z* F; k% m4 E* Q - s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));' x8 i0 Q5 t1 g
- , U; D0 R* k1 z" s8 u8 Q
- while (1){
& y* |* o9 d+ [. n4 C9 l& G - //发送数据
7 W s, m1 ?* ?2 M2 ]4 O - int a = send(sockClient, message, strlen(message) + 1, 0);
1 t2 S( T$ X# j3 M4 i2 J - printf("to server:");
3 J8 ~, V9 [' `+ `: j& g% m - scanf("%s", message);
; Z! R8 J6 \* M7 ~
+ c, f* u4 z& }$ d* _6 l- }. @) u' u) n- G# S1 U6 g
- //关闭socket: _, M( j+ ^+ q4 [/ H. `( N1 g. X
- closesocket(sockClient);
, P& `3 n' \- @% X - WSACleanup();" P1 I2 g$ F9 z6 ]
- }
复制代码 求懂的高手来解答一下。& `% q" o$ }! E0 X/ w
谢谢了!
, T# ?# {- e# W
7 Z& ]3 o! P$ ~) ~: H% M6 k+ f/ O. `+ l1 Z7 M! s
+ A. I) K$ D" ~ |
|