管理员
论坛积分
分
威望 点
贡献值 个
金币 枚
|
大家好,感谢你的回复。$ j6 n2 d6 ]; {- N& x
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
) z# I5 h) E( f: [" U% L( u- QTalk is cheak , show me the code.7 j+ O- z5 A" l
服务端代码:
- g* A2 ~! T. j6 ]" A( ^- #include<stdlib.h>2 k& ]+ u2 Q% y
- #include<WinSock2.h>
3 x; B: C; V) E& W5 X$ ?. ^ - #pragma comment(lib,"ws2_32.lib"): d5 n( v) q; P- H4 @
- int main(){
+ `4 w( J% @/ k" u - WSADATA wsd;& q+ w0 n9 O6 B; _7 D. L; r: K+ S* ]
- SOCKET sockServer;8 r+ w- u" \- g
- SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号
Z3 `/ A" c5 N+ [0 a8 r& R' @ - SOCKET sockClient;) \# K. n/ e$ v
- SOCKADDR_IN clientaddr;
8 Q( N; V3 b+ U - WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口* m+ C* S9 m; ]2 Y
- sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
5 r: q3 F, u- s' n0 s" e7 v
+ q4 Y& S8 n7 B; @; Y% }3 d
5 Z* J* Y) A8 n5 G6 j- if (sockServer != -1 && sockServer != INVALID_SOCKET){
6 |& v& e- R/ J7 ~, O2 s0 S, Y( X; S - printf("Socket has been created :%d", sockServer);3 A: u5 J+ A- r% z. `# @+ Q: X
- }9 M4 o$ R. J* `/ `- m
- else{
! G% o) z5 ]. B+ {- ]* n - printf("Socket create failed.");# p8 N. z0 x [, y
- exit(0);* V8 F1 c0 B0 R) k! Z3 T7 o
- }$ d2 r% o0 I8 ~7 V6 t
- serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);/ b! j* s7 R9 H- g. v9 c1 q
- serveraddr.sin_family = AF_INET;
$ @4 B9 ]8 j7 K) n9 u2 a; h - serveraddr.sin_port = htons(6000);//绑定端口6000
& Q/ Q1 G* n$ s, h- c/ D- V - int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
" Y$ x! }. O# S- J - char recvBuf[100];. r& F7 b" ]+ S" f e
- int len = sizeof(SOCKADDR);
1 k4 W5 i$ T0 Y$ f3 H. p6 G# x* E - listen(sockServer, 5);//5为等待连接数
7 P9 }( z* y% B# h" R- J5 ` - while (1){
2 J- u$ }- I; N$ k2 Z2 z/ b+ v - sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);8 G8 P4 p P# Y9 d
- //接收客户端数据
/ Y! Q1 x% R( R1 s. O$ v - recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);* v5 R9 `( h1 `7 ^$ V, b, V6 Z" U- P
- printf("to me:%s\n",recvBuf);
+ x$ ~, ~/ [! z( ~* `% A - memset(recvBuf, 0, 100);
4 ]0 b; j& `! V, p8 F - }; L% z& H n, v) l* t; Q
- closesocket(sockClient);
2 I( e, a. `1 @' n - system("pause");4 g) d$ | E$ I) D
- return 0;7 ^# A- V7 X0 E: a" x4 `
- }
复制代码 客户端代码:
8 P ~& c" t4 z5 Y: ?- #include<winsock2.h>
$ f+ r% @, i' X4 q# c i - #include<stdio.h>
5 \ h* s8 M5 ~5 H4 } - #pragma comment(lib, "ws2_32.lib")
( t$ E6 m9 P2 R7 `, {1 N& G+ w - void main()3 t5 Q, K) B. u4 B7 [) t2 k
- {# B: Z% f4 b9 Z3 ^! D- W
- WSADATA wsaData;2 }$ d" a( h' {* H3 z9 @& R$ d1 r
- SOCKET sockClient;//客户端Socket2 g1 B+ Z/ G/ p' B
- SOCKADDR_IN addrServer;//服务端地址
8 m. A7 a* l# c: J/ @8 _& Z - WSAStartup(MAKEWORD(2, 2), &wsaData);
6 {& D/ i+ U* k8 N' e- H - char message[20] = "HelloSocket!";6 ]0 E: |2 `# ]' V
- //定义要连接的服务端地址7 ?/ O& m3 E3 i* w8 o+ c) k w
- addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)+ B3 V7 S6 F8 S5 C+ }
- addrServer.sin_family = AF_INET;& b& v) k- }& P
- addrServer.sin_port = htons(6000);//连接端口6000
1 j5 ^! W$ R' b6 J - //新建客户端socket
; b0 v+ o0 D$ l" l - sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);. y$ d- o" R$ B: q$ s
- int s = 0;
2 V e; i; U* ~8 J. I9 h" l' H - s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));: ]6 D2 n* k) @+ q' R
- " p6 x( \+ G7 {; C, y
- while (1){
3 |( {. j! B( [ - //发送数据- w" U9 t3 I& ^' y1 a, A( q. C
- int a = send(sockClient, message, strlen(message) + 1, 0);
! ^! `4 a/ x- e/ \: j" ^. q - printf("to server:");& j! O" g2 c3 O* ~* n i6 O
- scanf("%s", message);- }& p2 \. ?; w7 ?1 ?8 p
- 4 G: s- ~3 B7 D4 ~ ^2 U+ d, h
- }; r0 D% z9 N& @: {4 i& _( W: t# t' P
- //关闭socket3 m# S r ~) |7 g$ @
- closesocket(sockClient);( }5 r, l2 f5 N s# S/ M
- WSACleanup();7 y" S; x5 K# Z& B ~. v8 t" g
- }
复制代码 求懂的高手来解答一下。
; h: v/ c5 B: F( v8 E' K谢谢了!, \% p! ~+ p, i4 k/ w
: ~" h [( {$ t: _+ a2 N, _) c% Y' O& l, g) D. X
. }2 a- v$ J) i8 l2 r
|
|