管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
大家好,感谢你的回复。
, @# C$ D* a) ` x我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
, U) l* x7 o( z7 XTalk is cheak , show me the code.* ]; E! Y E( Q$ A H! \
服务端代码:
3 z* L2 W6 |8 V. M4 ~/ ]+ a- #include<stdlib.h>0 y: e6 q' Z( c+ S9 N! {/ y
- #include<WinSock2.h>
1 q* v0 ?0 s1 {2 G - #pragma comment(lib,"ws2_32.lib")
7 a2 v8 q! {" l; M4 i0 {8 M4 c - int main(){
+ d! O& W/ Z: a& w; G - WSADATA wsd;
! [1 W5 n/ l5 Y$ J+ |9 u - SOCKET sockServer;8 F, h; f' C9 Z0 n s7 E) Q6 Y
- SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号
8 i" `( W$ ?0 ? - SOCKET sockClient;; [8 j% F8 }: l5 ~& Z' F
- SOCKADDR_IN clientaddr;7 o L2 k" `5 r8 f) c
- WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
2 g6 ?( g" \( Z& n5 }- | - sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
B ^3 Z& K1 M1 }9 d! v - / P+ D6 O- j1 K) O" t
- 2 H6 _$ ?2 T3 H: _5 X q
- if (sockServer != -1 && sockServer != INVALID_SOCKET){+ ]: _" E, k! w, p# D
- printf("Socket has been created :%d", sockServer);. @$ a5 k; `& j1 j _
- }7 i: p' D. P5 u
- else{
) ]4 R. U9 v3 y - printf("Socket create failed.");
" g1 x2 A' H1 O5 F# X - exit(0);5 D/ ?7 s3 z% L8 a3 g/ R) H
- }+ W- W) t5 v3 u2 q" |
- serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
$ j$ c- p1 j; n3 h7 [$ x8 e, K7 \ - serveraddr.sin_family = AF_INET; J% X g- Y. B! W: ?, F8 u
- serveraddr.sin_port = htons(6000);//绑定端口60003 { q0 }2 f9 ^) q" u, k
- int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
& A$ b: ?! L6 K. v - char recvBuf[100];
5 u: R) t+ O w+ X% O - int len = sizeof(SOCKADDR);
' i/ W5 b8 O) }% N( m$ g& ]) x - listen(sockServer, 5);//5为等待连接数
! W1 o/ `# w' Y% _/ V* M7 p - while (1){% C. [6 I9 X9 u3 H/ U, H4 M
- sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);8 p8 U2 S- V1 K
- //接收客户端数据0 a) y7 Z% x& ?+ O% k; O
- recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);. U7 m! n( X9 x" [/ P9 l
- printf("to me:%s\n",recvBuf);& {" F* ~* ?: }0 j/ Y5 M
- memset(recvBuf, 0, 100);
6 X8 h0 k! w0 O4 Z - }
0 ]) W4 z0 n/ @' i - closesocket(sockClient);
! h# s( u" `. c | o9 j2 {* g - system("pause");
( m l) u/ j! C8 o' A' | - return 0;
. v% u$ J2 \8 m- S - }
复制代码 客户端代码:! Q; t6 i+ n. ?' F% `3 P# U
- #include<winsock2.h>
+ B0 T/ u: X2 [- t* @+ \ - #include<stdio.h>% U2 R' x; q+ f
- #pragma comment(lib, "ws2_32.lib")4 s. R* O7 p* _9 l" d3 g5 i' N1 Q
- void main()4 V# A( U" X$ j. r$ T
- {' E, N7 G I+ [. q, n& O; |
- WSADATA wsaData;: f( s0 _: X$ g5 V9 b3 g- `
- SOCKET sockClient;//客户端Socket* E: t6 l- G( y- P2 t" H
- SOCKADDR_IN addrServer;//服务端地址! Y, [$ s9 e0 G2 M* n
- WSAStartup(MAKEWORD(2, 2), &wsaData);
- g& L, X+ Z) j6 U7 Q; [: [+ j: n9 M( P - char message[20] = "HelloSocket!";: k% v+ l0 ]8 F5 B' n: U
- //定义要连接的服务端地址, t3 l6 b d9 _7 J- K) K0 D
- addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)* L9 _; f; Q& d* ?: j
- addrServer.sin_family = AF_INET;) v& J' G' t0 u. V% J! S$ ~
- addrServer.sin_port = htons(6000);//连接端口6000) D! p6 s, E* W0 _; F5 p; O
- //新建客户端socket
3 S* b) S, \% I, x1 [. } - sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);; w2 m) d m" l/ S# S/ E$ O
- int s = 0;1 U+ b; M8 ^' |; ^5 _
- s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));" Y( O0 A0 E8 N9 B% `8 K
- , v8 O- D0 X3 [" [2 r- N/ e
- while (1){
& e x+ M: u& A4 u0 E3 ?; b: I - //发送数据
- l! z5 `# N5 b+ X6 z+ x" e9 x - int a = send(sockClient, message, strlen(message) + 1, 0);
8 i! y7 k6 \7 ? - printf("to server:");
6 X. r: ?% _: l: E6 t- h L - scanf("%s", message);
2 P1 O9 l& G- [) e- K
- F0 }. k- Z) a. o" \( ]* F4 T4 R- }
6 |- g: D7 S5 e# i - //关闭socket
2 p2 U3 @2 k4 v+ p$ y6 g. A - closesocket(sockClient);: S" ^ I1 s. m& d0 F
- WSACleanup();
/ X. p5 d5 Q/ { - }
复制代码 求懂的高手来解答一下。
( u" i2 V4 S9 H谢谢了!# ?. i8 @6 i( h3 F0 Z
3 n \: C# \2 P$ B' P
; R2 V9 Q2 p1 ^3 H" M, N4 e, J) v" o" F: s9 Z Y
|
|