管理员
论坛积分
分
威望 点
贡献值 个
金币 枚
|
大家好,感谢你的回复。
; a1 g5 Y7 Y4 I我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
: u& E4 r% z, [5 {6 ^2 hTalk is cheak , show me the code.
5 t/ {' P' [- [, I6 ^$ Q v7 A* f服务端代码:
' ?" O# f) X; W ]% J9 k0 [- #include<stdlib.h>
7 o9 j- P0 V* _ - #include<WinSock2.h>. S& M" L) ]% z
- #pragma comment(lib,"ws2_32.lib"), p& D: |" h& }
- int main(){
4 A. x2 p+ I3 [! p- E) ?* W* }& j - WSADATA wsd;, c$ J. ~3 X, f# W5 Z7 ]
- SOCKET sockServer;( a8 T& g: D8 Y
- SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号
4 V3 g3 S1 Q4 E$ M7 V$ j5 {7 m - SOCKET sockClient;2 b. z9 k0 y$ F( x" {9 P
- SOCKADDR_IN clientaddr;# i1 }$ t" C9 g, y T, B! O
- WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
4 n3 ?5 N2 C7 {+ w* C6 v - sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
7 ~" z" F1 s: K: C: Y! j
9 i; T: h$ I7 H, X g6 l L- 3 S0 V0 M" t3 \. B! I1 w
- if (sockServer != -1 && sockServer != INVALID_SOCKET){: N5 _6 B7 I- i, }3 L3 x
- printf("Socket has been created :%d", sockServer);
) q# j: d3 ?. V' m' T/ S - }
7 B( @" ~* q8 \6 n4 Q - else{
2 T/ a* G0 G6 u. e& q: T - printf("Socket create failed.");5 U" w/ G1 D8 K- v' c7 j7 C4 K
- exit(0);' n5 W N4 ~/ ~+ {
- }1 g/ t- n6 U# D, ^1 B6 b$ D( q- w' g
- serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
1 Z6 k2 U: O% u - serveraddr.sin_family = AF_INET;
9 C- |6 D! t5 t8 [2 | - serveraddr.sin_port = htons(6000);//绑定端口6000
" c, H* I/ r8 I! K3 S/ ^8 s6 Y9 i1 P - int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));5 t r/ c, n. l, P' ~ n2 B
- char recvBuf[100];
3 |1 a8 ^! v8 k; q; a - int len = sizeof(SOCKADDR);% r- Y; U( ^0 ]4 C7 B+ ]
- listen(sockServer, 5);//5为等待连接数4 T! `! \) c% n7 \, ?: F8 x- ^
- while (1){; ~3 G5 s* X3 J. t# t* V) ?1 C1 }
- sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
( D4 B4 }7 ~5 a T3 T - //接收客户端数据
+ Y }( C$ K" F6 Y" M - recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);$ t$ ~) r4 J) G! ? C8 d
- printf("to me:%s\n",recvBuf);) v; e9 T9 L8 w3 d5 e+ J) G! g3 H
- memset(recvBuf, 0, 100);
& F, m5 }- s0 u; R9 I4 ^2 Z" W - }
( R# F9 }6 l+ y ~5 \( t4 @ - closesocket(sockClient);
" B) W# ~5 V# F# J - system("pause");
/ ^8 p H& U# W* a# [ - return 0;* Y- a, m' r+ H4 A+ \$ E
- }
复制代码 客户端代码:. s: L) f# Q6 W1 B. V
- #include<winsock2.h>
% m# X/ e# p5 ^7 x - #include<stdio.h>
! {. o" F$ l" b: d( l8 ~ - #pragma comment(lib, "ws2_32.lib")
, r. `$ ]9 C/ c' x9 @0 s' J* y - void main()( ^# Q4 y J# }& t# B! o, U+ k
- {
3 x# ^0 x* | g) c - WSADATA wsaData;
2 v$ p5 Q* Z, _ - SOCKET sockClient;//客户端Socket7 |9 z& z3 c0 U1 W! f$ u
- SOCKADDR_IN addrServer;//服务端地址& P6 O8 t/ ^. y5 k: ~: u4 {
- WSAStartup(MAKEWORD(2, 2), &wsaData);& M! Y. V2 R2 B4 o6 o: A+ Q
- char message[20] = "HelloSocket!";" @. J5 E: ?5 k
- //定义要连接的服务端地址/ t1 m6 _; M/ ]5 m7 g/ q2 w
- addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
$ ?# A3 Z" Y7 X1 y7 ^+ @# h2 L - addrServer.sin_family = AF_INET;' r& G' w s& z" T; K8 B$ ^( _9 Z9 a
- addrServer.sin_port = htons(6000);//连接端口6000: J3 a# H- a+ @4 R+ f
- //新建客户端socket
. F- o a6 W! E8 P1 y$ h' U - sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);) j$ \9 s2 O+ o( {2 v: [9 Q
- int s = 0;
. f, L8 b- m S% o8 A/ v- ] - s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));/ K; p2 g$ {" V }
% f9 |! n" Y2 @- while (1){
7 N o) @8 {1 ?3 c4 ]0 r; k - //发送数据
6 d4 v* c! t+ l$ a: Y0 \. g* Z0 D+ o - int a = send(sockClient, message, strlen(message) + 1, 0);- n$ Z; g, X/ V/ w) \& \9 C1 G
- printf("to server:");
* b+ @8 j1 c8 V- Y9 Y B8 X5 C7 U - scanf("%s", message);. q' q0 ~" L2 g' S" m' e7 I* ^
- - r. U$ s6 V+ }) b
- }- }$ l" T2 T( v1 L. l
- //关闭socket
$ \) m* v. U7 n6 ` - closesocket(sockClient);
) |! V' P2 B& t+ t$ y - WSACleanup();4 a! @/ x+ B7 A5 A
- }
复制代码 求懂的高手来解答一下。# P# E& x% S T. ]
谢谢了!- y% \5 M4 [, v# J1 I
' q& j0 Q0 Q* o2 ?3 i- T
3 {7 H' Q9 K5 e/ e8 R( ~. M+ y: ? ?# ]9 D7 G7 ?/ K
|
|