管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
大家好,感谢你的回复。0 B3 |) w: i- j1 j `, O% q' y5 W
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。8 q7 C9 k$ q' w' Q. x
Talk is cheak , show me the code.
8 X! i) X! D3 v; @; H4 l服务端代码:/ j, E8 F6 N {% W: S6 K; R
- #include<stdlib.h>6 ~2 ?$ Y) y2 k% h, D% i* O
- #include<WinSock2.h>
9 g( S8 N$ f" [) i7 `" c. W9 v: | - #pragma comment(lib,"ws2_32.lib"): _5 N3 \6 E1 J" N' C/ a' ^
- int main(){
0 H/ I4 [( l9 }1 C8 k - WSADATA wsd;9 ]: p7 G7 i/ X+ U
- SOCKET sockServer; D) n8 [' J! Q5 m0 I! g7 ?
- SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号
& \9 z3 j; N4 N2 q( s5 S( d - SOCKET sockClient;
* Z& @( B" g4 l7 Q p0 W8 W8 r& @. f - SOCKADDR_IN clientaddr; T* @% Q# a% L
- WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
8 z5 W3 v; ~% w7 I# ~3 M - sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket- q7 d; j. |8 L
- $ _# M* U* ~1 T5 P8 U
- * d$ Y5 V9 \/ W0 r( }6 \
- if (sockServer != -1 && sockServer != INVALID_SOCKET){
5 V" L; v. m9 V* z& [ ^1 d2 ]; K a - printf("Socket has been created :%d", sockServer);' ?$ W1 F% o; T7 }8 D
- }
6 [& ?' }3 U/ \9 m - else{, p; v G7 l8 m8 y( l
- printf("Socket create failed.");) J% l# z4 _2 T' c2 m
- exit(0);
5 {: Q' k3 t& i2 N, A$ g - }
' S$ R: F8 E1 f- _6 g - serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
) i6 m, t) F# H6 Q1 _- i - serveraddr.sin_family = AF_INET; x" C0 b! W+ Z% N. a8 w3 l
- serveraddr.sin_port = htons(6000);//绑定端口6000
3 R# W( ?6 D$ J" e2 K! J6 I4 u - int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));1 x8 c* \/ ?$ w V n5 a) F/ w' R
- char recvBuf[100];1 l# E/ g! L. T" H% i/ n' C
- int len = sizeof(SOCKADDR);# u3 J' K+ d; [/ K9 J) G: e8 L
- listen(sockServer, 5);//5为等待连接数+ R: a* ^& C( W# ?# Y+ x
- while (1){* Z. u' _) J; b+ j/ G H
- sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);7 \$ b! H) B5 d; e: e
- //接收客户端数据% j; M/ ~' D# U* q
- recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
& g, w7 L% L3 Q( [) i7 H - printf("to me:%s\n",recvBuf);$ x( e! @- |/ Q& S
- memset(recvBuf, 0, 100);
" G" Z0 H9 U2 Q5 w/ A - }
( ?% @( E7 s' n9 v- ]6 E# _ - closesocket(sockClient);
4 F6 L: F% t5 [" G! d; A - system("pause");' W9 ?4 R( \( C& x( |
- return 0;+ s. G/ ~! H; D( w$ Y
- }
复制代码 客户端代码:
; q" C. N# [( Y; ]/ Z2 s% d1 f: S- #include<winsock2.h>
) z) K5 z3 h4 A9 } - #include<stdio.h>
; e5 \) I& \( u# ] - #pragma comment(lib, "ws2_32.lib")! X: X7 j4 Q( R# I
- void main()
) l5 }! y3 P$ q3 B - {; w L! X% n3 S k* A/ i: L: F$ _
- WSADATA wsaData;7 `: X# Z5 p* M
- SOCKET sockClient;//客户端Socket) s# Z' N, T7 \$ r
- SOCKADDR_IN addrServer;//服务端地址 m5 R2 F. @6 P$ w t; B- W
- WSAStartup(MAKEWORD(2, 2), &wsaData);0 J, r; B& y7 L
- char message[20] = "HelloSocket!";" b; i" @8 r. G# I* B9 J
- //定义要连接的服务端地址
% S4 D+ A- u& B# B- w - addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
: ], k$ U& V+ x: g2 x. O - addrServer.sin_family = AF_INET;
9 R/ ?8 v2 V1 T& t1 ?+ f9 A( h- {# y - addrServer.sin_port = htons(6000);//连接端口6000
+ r0 n4 w8 n# h. s - //新建客户端socket
" ]( g. v% {# N7 ` - sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);( A/ k6 b+ r1 P
- int s = 0;
2 e) n+ k+ Q' q4 J; Y. K - s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
" n6 j6 c+ W& B9 r7 l h
Z4 F: _" [5 V* h# h- while (1){
3 d: E" w9 g: ^6 S) z& S( j - //发送数据1 w( G" i' J7 F0 Z1 V
- int a = send(sockClient, message, strlen(message) + 1, 0);- W9 v/ \& F$ X/ m* p4 z; o% |" r% d
- printf("to server:");& c' } a# s2 w2 Z& U4 D
- scanf("%s", message);
) L9 l, q) |' {5 @$ c
" q: o' S) y5 C+ b% ^- }
A" S: X9 t, e: f- }* T - //关闭socket$ y5 L, V5 a+ [! I4 q) M4 t
- closesocket(sockClient);
, Y z4 S9 u2 Q" l- Z - WSACleanup();
7 v7 C9 p/ C: Z - }
复制代码 求懂的高手来解答一下。& }9 i; r5 q7 r2 C; a( h% p' D q
谢谢了!
1 R( S' D+ L) o3 M! w7 s
3 }+ {+ c. ?- {5 D: S- e, r4 a7 ^6 Q" v& L8 E
9 ]& n+ B9 T( r$ F9 Y |
|