大家好,感谢你的回复。" a9 |" a) ~4 `( n, n) p
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
. g8 C2 }3 U0 s0 {5 z1 ^! [8 d% N( _Talk is cheak , show me the code.* n( K6 C8 w; B, |5 T$ g& S6 F* W
服务端代码:
) w+ }2 p* M, Z+ l. V! c8 o- #include<stdlib.h>* J, o* p' t0 ], H# @
- #include<WinSock2.h>
; o; |+ ^$ y$ Y' c% ], @ - #pragma comment(lib,"ws2_32.lib"). ~* }5 q6 Z. ~
- int main(){ H2 J0 G1 E+ z; Y2 P" q: B7 D
- WSADATA wsd;. ~- o& j0 D: s. H, Z
- SOCKET sockServer;
1 q0 Q0 {/ G9 `- H2 G- Z; M9 q9 N - SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号
8 u+ C$ c# C' C* q - SOCKET sockClient;
+ ^* l' n4 C) ` S. [3 | - SOCKADDR_IN clientaddr;
* o/ ?) ^) N3 z" _9 R- u - WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口' i- l% O1 a& ]' ]+ o( P' L
- sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
( s" d! U4 |( j# y8 k - ' S% \ z; }: [* [) \; s" [7 Q
- 0 W* {# [6 H" O$ _ B! V; \9 O4 O
- if (sockServer != -1 && sockServer != INVALID_SOCKET){
0 h \6 p- d& ]# c% s5 M8 s - printf("Socket has been created :%d", sockServer);
& P$ z9 y8 r1 W! J% P! D- L - }4 q9 H( Z, h3 r) @/ b
- else{+ Y& M9 g% h) R0 Y$ h1 z4 A
- printf("Socket create failed.");& d; G2 X1 y: s7 L- X5 D' l
- exit(0);
* i, `3 j6 N1 I0 b4 C+ S - }: t; ~( o; M' n) N2 B" e
- serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);, f8 c4 Z/ r! [" X8 e# ]
- serveraddr.sin_family = AF_INET;
8 L" \3 M$ p7 m' Y; [ - serveraddr.sin_port = htons(6000);//绑定端口60001 J0 l" C5 x% `
- int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));, W9 j: @. M5 E4 T4 ]
- char recvBuf[100];! o& Q5 |- r6 j* y
- int len = sizeof(SOCKADDR);0 ^. e2 h C5 i+ G O+ D
- listen(sockServer, 5);//5为等待连接数
/ p1 ~3 W6 X" N6 ?0 E. t* U7 K4 h" H; V - while (1){
7 Q% V4 b6 z% u - sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
( Y& V: Q1 W j, q4 r - //接收客户端数据
9 N8 \7 U4 V; Q$ W8 y1 b - recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
; E9 t2 T- v: Z4 u+ H* p - printf("to me:%s\n",recvBuf);! H {( V. s* O7 c0 R
- memset(recvBuf, 0, 100);
5 }& R8 l' K" |' B4 O7 Y) ^" B - }
2 \' H1 U: m; a% ^% X6 l! O - closesocket(sockClient); f% O K; a. D- M0 w3 ^
- system("pause");
5 t+ \; W2 a% ]$ e: Q - return 0;
+ u2 o4 n$ A, t s- r' t+ c8 Q - }
复制代码 客户端代码:: X c3 d# D& Y7 g1 Z
- #include<winsock2.h>
! L! i9 L; G$ ]+ q n" @) B - #include<stdio.h>
( n6 m: K; S+ r - #pragma comment(lib, "ws2_32.lib")
/ Q; b: S! K% w* }$ N. M - void main()
# e% A$ h. o1 s8 E' W" b8 F - {
0 C) _; D4 O% o. H( y - WSADATA wsaData;4 x: H/ I9 k' V6 Z. R5 E' Q' t
- SOCKET sockClient;//客户端Socket
- _4 V% v- p7 {1 A+ B8 b - SOCKADDR_IN addrServer;//服务端地址% l% ~: U/ A0 m
- WSAStartup(MAKEWORD(2, 2), &wsaData);
8 x4 U7 p' R- ? c6 Y9 T5 ] b+ b - char message[20] = "HelloSocket!";( @6 H) B) n8 b# N
- //定义要连接的服务端地址
/ w+ M2 d1 D1 s1 ^& S3 G) d: }: b - addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
, ^9 q4 [) R- I - addrServer.sin_family = AF_INET;! f7 M9 B+ q- y9 z/ X0 S1 j u
- addrServer.sin_port = htons(6000);//连接端口6000
, H6 p) `9 J8 T# d0 s2 n6 v' D0 l5 } - //新建客户端socket" M: p: [: I- v
- sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);5 G. U$ R0 v: m2 R2 a2 q: d
- int s = 0;+ F5 @, ]. I9 a, q# |
- s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
- v# \" w5 O4 @4 ~6 Y8 g. W- k- H: g - C$ h* }* x8 Y
- while (1){
" ~3 N2 Y" ~1 ~7 O) l3 [; ~( g - //发送数据
: b$ G/ Z7 |* K A; Q - int a = send(sockClient, message, strlen(message) + 1, 0);
; l5 Q7 [4 n6 [; q' g - printf("to server:");
+ f, x: `/ U% A4 P, o: L - scanf("%s", message);
6 ]) c2 k7 Y! E% _
. Q' p, ~0 q' m. I' V- } N$ j, a" y% |3 I% K# Y, G: `
- //关闭socket3 d7 U( _! I& b- E1 v
- closesocket(sockClient);
8 p' |2 b/ Q5 E8 S. B - WSACleanup();1 `: N! l' `8 q/ r# e/ U
- }
复制代码 求懂的高手来解答一下。 D; e+ U( a) _+ l7 Q
谢谢了!% y7 `! ^4 B* |, e
/ b! G7 K5 K# G; p& R* I1 N9 Y X
7 Z. u$ m' A ^ R- _6 m
|
|