管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
大家好,感谢你的回复。& j/ g/ u5 l: I+ b: `# s, M
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。! }8 }2 I# a" N9 K
Talk is cheak , show me the code.* c" O( @& Q1 f
服务端代码:
, e) R0 c% Z7 c# T8 j- #include<stdlib.h>
! V2 x$ _) X, l- v5 L% v - #include<WinSock2.h>3 j, d4 J% C3 Z: w, }/ p- V& p
- #pragma comment(lib,"ws2_32.lib")1 Y1 i; H0 S2 [% h; `0 `0 e
- int main(){& u4 M( c* | h) H
- WSADATA wsd;
& r D) ^* f; c ]2 H5 `7 \8 o - SOCKET sockServer;3 r$ f$ C1 H9 L1 l n( D3 C* a) V
- SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号, D F: y* Y6 E# }! H
- SOCKET sockClient;& w8 y) F5 B0 {6 V% p r
- SOCKADDR_IN clientaddr;
& B% c U0 B& y0 q$ n" i - WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
! ^5 Z( [: b: w& H: \& o X2 } - sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket. Q. b% X/ Q1 Q; \1 O
- 8 M, ?$ K3 \' O7 S: g% T
" Z/ ~6 u; g# T( O' I- if (sockServer != -1 && sockServer != INVALID_SOCKET){
: u" `5 T- s& r+ { - printf("Socket has been created :%d", sockServer);
/ C- V3 t w$ @* o% I, n6 ` - }
% M6 x) R; }' e5 Q# e0 m - else{6 W! ?+ }" P! y+ q/ ]
- printf("Socket create failed.");
8 {% f( D5 K4 v4 q: l$ ` - exit(0);
5 a- @* T1 L5 a5 B' e. r - }+ m% @4 k6 `4 {) s0 ?9 g
- serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);7 S7 ~7 T W1 O
- serveraddr.sin_family = AF_INET;
) I# S4 u( B. S0 x - serveraddr.sin_port = htons(6000);//绑定端口60002 A3 [$ `5 C" @7 M. \4 a; N
- int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
% `4 f. f/ K% Z- b5 f - char recvBuf[100];
H7 z f7 d% {" V7 Z1 A9 M1 x! b - int len = sizeof(SOCKADDR);
; L; z6 z, k6 N$ }8 K2 S8 O - listen(sockServer, 5);//5为等待连接数2 r& ?8 E, s! h8 x4 y8 |0 t& L9 b
- while (1){
2 T. Y6 X& l2 E. T. c; j - sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);7 t" C/ J! e" g" ]. j3 |6 e5 [
- //接收客户端数据* L/ s; J# X! m, P E
- recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);( t% K+ W3 i1 C
- printf("to me:%s\n",recvBuf);
$ G( \ R+ \5 T8 X7 y, \ - memset(recvBuf, 0, 100);5 J9 }7 M4 K2 a B
- }/ M# e1 k: W" c, z
- closesocket(sockClient);
0 x) b& T9 f. y% ^; W ~$ ] - system("pause");# R& P3 V& K1 G
- return 0;
$ }3 j8 _7 {. W) A) d - }
复制代码 客户端代码:8 L1 n, g5 s+ e
- #include<winsock2.h>. c( U3 z3 z! U& j, {+ ?- e
- #include<stdio.h>
" \9 `9 E1 L) V1 u) g; S - #pragma comment(lib, "ws2_32.lib"); z6 u* s: }+ ~0 j$ P+ o9 C6 j( j+ t
- void main()
$ U. }5 _5 q9 T9 r2 c0 r7 P. O - {; a# A) M& E/ a9 h
- WSADATA wsaData;7 i8 L2 e4 d" _; u j
- SOCKET sockClient;//客户端Socket5 ^* y1 r7 q) ?5 `# }- L' O
- SOCKADDR_IN addrServer;//服务端地址
9 y8 Y* q" c3 w* O; ]) } O" T* H - WSAStartup(MAKEWORD(2, 2), &wsaData);
+ ]- Q0 j+ D* Q3 g3 Q4 c9 T - char message[20] = "HelloSocket!";
6 z$ B* {3 Z- m - //定义要连接的服务端地址
1 i1 ?# J/ s8 C4 n - addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)9 |9 V. X4 e" A' ^, l. W) T
- addrServer.sin_family = AF_INET;6 o; w0 v6 V& d" I& T: |
- addrServer.sin_port = htons(6000);//连接端口6000- A0 ]. u; t8 g5 `, t
- //新建客户端socket
/ B( x( O, F! R0 c$ V3 r# D# v - sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
( y; \2 g; H9 E( H) F - int s = 0;
8 H- \" C; \. @/ l - s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
8 V2 V: c/ o1 [; a4 G+ B+ m. K! v. v - 8 Y1 Z$ T& J3 E' @% A
- while (1){
6 W/ k1 f, |5 T% [# {) i0 k - //发送数据* P) h7 v2 D6 [1 }+ Q2 Z9 j. f
- int a = send(sockClient, message, strlen(message) + 1, 0);' Z: \% X/ `& B% q. w6 ?
- printf("to server:");: ]' m4 b1 P8 h, u# L4 n3 M
- scanf("%s", message);/ X: \" J& i9 P+ Y
2 L# c; L/ p% P8 t- }# q' G; j; @, Z+ i: _
- //关闭socket( c E) q6 ~0 d
- closesocket(sockClient);
5 L7 t# f8 m! q$ T- p- t1 G - WSACleanup();, O8 E! |4 w- v9 p* S% G6 P8 M
- }
复制代码 求懂的高手来解答一下。
8 f. R* z3 C$ z* z谢谢了!2 I. \$ m7 I6 N8 }- y1 d
/ {5 r7 @& Z1 C4 Q" I
8 t6 x- i: E. d
$ J0 C3 c4 I. ]( L, B |
|