管理员
论坛积分
分
威望 点
贡献值 个
金币 枚
|
大家好,感谢你的回复。# S/ G$ [8 y4 k: o6 `/ t$ ?. L z
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。; R+ q$ y V9 ?) |
Talk is cheak , show me the code.4 j& U' q' h( N& f( a8 Q
服务端代码:# t. f8 m$ n6 f6 U: V9 f8 }
- #include<stdlib.h>- H2 m0 t/ H8 O0 K4 y& a
- #include<WinSock2.h>0 {, j2 w& Y2 ~, X
- #pragma comment(lib,"ws2_32.lib")
# ^( U+ d' O7 U, Y# p" ]( K - int main(){) b; v& F/ W) U' y- |
- WSADATA wsd;
8 H5 q* |0 X& ~& E( M6 q - SOCKET sockServer;
" `8 N7 \& i1 W( Z+ ^ - SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号
" Z, p0 y P5 o5 f& G" ?9 y0 R - SOCKET sockClient;7 a) S! \* h: j. c
- SOCKADDR_IN clientaddr;& u. C; l2 h0 I
- WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口$ p' c2 U D- J
- sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
" i' N# E5 c: I, n) @/ a
* X! A, O. [. U* L- w$ U- $ Y" M; V8 H, K+ b9 A$ B0 \
- if (sockServer != -1 && sockServer != INVALID_SOCKET){
1 o- ^$ b* _. o( N/ f" J3 d" j - printf("Socket has been created :%d", sockServer);( Q+ l9 i4 U. h8 ~, r
- }
; j$ l: m2 d. F' ` - else{1 Y- B! A& s# z: H
- printf("Socket create failed.");' N: t2 f0 R2 H8 D( b- G
- exit(0);
) J$ H; {4 X+ Y5 M& t8 C - }
& P; q3 q" W# P# x5 i3 A+ S - serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
* D4 S0 _+ Y7 ?& w8 l3 c7 [ - serveraddr.sin_family = AF_INET;
8 s! H8 \9 b1 j - serveraddr.sin_port = htons(6000);//绑定端口6000
/ M: M% @) g: F0 E - int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
: D I3 D: s; f - char recvBuf[100];
9 Y8 s9 G5 w9 ~" \% T4 E - int len = sizeof(SOCKADDR);
+ u- \- u- j8 O) s+ M6 g4 ` - listen(sockServer, 5);//5为等待连接数
" f% D4 f7 C/ W7 G7 n6 K - while (1){; h( N* J# K+ _+ ^1 M
- sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
- R2 V5 x, i9 T) S9 P, @0 w - //接收客户端数据3 b$ |0 w: S) x, P* E+ \! B
- recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
& I- a6 n& E) x6 m8 ^$ F* c - printf("to me:%s\n",recvBuf);
. J( |2 C# |% N3 P& i3 S; m; v9 ? - memset(recvBuf, 0, 100);
$ e3 E- F+ \0 e- }' R - }
) l9 Y$ P! H' m6 G. f4 M - closesocket(sockClient);
( J# K4 o: v! N( d- H. ~( \ - system("pause");4 C+ }* ]9 z% H& T
- return 0;9 J* t4 i1 @) d/ W
- }
复制代码 客户端代码:
x: V% z3 ]5 _ D- #include<winsock2.h>
5 Y3 @. j$ M& X ] - #include<stdio.h>8 W2 |5 e( c5 }' i2 M. ~8 [
- #pragma comment(lib, "ws2_32.lib")0 B' \( k% A# i. ?* O: _6 w
- void main()
/ A0 ]: q/ R. ~/ y - {
+ D5 a: j; L: x! @: ~ - WSADATA wsaData;
& s( T) J( X6 U% O/ s4 j - SOCKET sockClient;//客户端Socket
7 u( R) E! b5 W4 U - SOCKADDR_IN addrServer;//服务端地址2 S* Y$ \0 V3 ^: K+ \
- WSAStartup(MAKEWORD(2, 2), &wsaData);
$ Z9 {6 @7 s8 L* x - char message[20] = "HelloSocket!";
; S6 y2 {' H1 l. ^ - //定义要连接的服务端地址: z) d2 ]2 o m9 ~0 j9 z! Z5 j
- addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
7 j% u- x4 u9 v" S! [* R - addrServer.sin_family = AF_INET;3 z& x4 V4 j* a
- addrServer.sin_port = htons(6000);//连接端口6000$ |! \7 r! a. a* f1 Y
- //新建客户端socket
: n4 i) E- m$ E2 D* Z - sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
. s; k: I# k% |, N- R - int s = 0;
" |3 W, y' o8 ]' e - s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
: ]! @6 z' b6 o - % L* b/ R) U/ C: j$ ^
- while (1){
# {: p7 U" Z% M) r# @ - //发送数据" ^' H: N# d5 c" G) X+ ]
- int a = send(sockClient, message, strlen(message) + 1, 0);
; E2 r1 [. |0 R$ X/ M - printf("to server:");
; [! a( _8 e% A - scanf("%s", message);
0 L5 w6 f/ D' |: i
" u! B/ q! h: }- }
' b$ T' b- E1 E7 G - //关闭socket/ J5 L3 o: l h1 m+ ~
- closesocket(sockClient); O, [/ M/ V3 B) `3 {* X
- WSACleanup();9 j3 {' z9 L6 w6 i, @3 _
- }
复制代码 求懂的高手来解答一下。
1 D G) u% l# e$ @谢谢了!
5 ~ b- D2 v. ~! C/ g" U
( S5 K C$ n" U# ?% t1 Z3 w- m! K, Z8 H: G
" w$ N9 x; ?" X% ~/ W. f8 F
|
|