管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
大家好,感谢你的回复。/ s6 W9 ?4 _/ r5 ]
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。, |' h9 |- o+ M0 V
Talk is cheak , show me the code.
$ |3 a) Z( j. _: s3 d服务端代码:
" T G8 [% `. Q& U- #include<stdlib.h>, {& i S' I" Y1 @) F9 I1 I% _4 u
- #include<WinSock2.h>6 L o4 X+ y* |1 }! p0 o: ?1 N* p
- #pragma comment(lib,"ws2_32.lib")' ~2 T8 @( \ n* h; q: F& o
- int main(){
& ?$ {) {0 @9 W* j& ~* T# z8 y+ E - WSADATA wsd;
3 ~: g$ g7 [' p7 j1 Y" U) W - SOCKET sockServer;
1 T6 B, n4 H1 d9 U' O - SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号
4 q1 V" G' \- q+ s7 D# Z/ F" E5 D - SOCKET sockClient;
" j5 x$ T# A: h. z6 t) w7 X9 n4 m - SOCKADDR_IN clientaddr;
! Z0 e2 B( F' \* Q8 P' T6 Y, t2 h" v - WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口* e0 |, q% B7 @# \# q8 W9 [4 `; J y
- sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket- _- E# F2 X4 L* M ^
- . n( \0 Y# d; O0 J5 V# R
- ) J' S. r, ?0 n' W( j4 _
- if (sockServer != -1 && sockServer != INVALID_SOCKET){
$ R3 k/ ~/ s0 t( \; x; y - printf("Socket has been created :%d", sockServer);
( u' D! ^- v. z) @! i' j, c% s. _9 h( C - }
M: a2 \7 z1 u3 f) F0 i - else{
5 h; p4 T% {% l [ - printf("Socket create failed.");
% g7 \9 z+ N- O, G8 D* V - exit(0);
# v7 L9 A% I+ Y j8 G - }! ], h$ A; A" q
- serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
" {! e, R8 t! l+ M& F* o - serveraddr.sin_family = AF_INET;
9 r9 |! e' |0 f6 O - serveraddr.sin_port = htons(6000);//绑定端口6000
! v& \: `: `3 [. Z& p6 g. f - int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));6 `, k6 E) i# g; V: e b
- char recvBuf[100];- |) F: }1 G& L; `! q5 M
- int len = sizeof(SOCKADDR);, M/ [ u' l( l7 @* n( ^0 }
- listen(sockServer, 5);//5为等待连接数
L/ `+ g( N+ w5 G- W - while (1){9 x+ @/ X3 Z3 G0 X4 X6 n
- sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
9 ?9 f9 v, ^" z" f! k0 M* Z - //接收客户端数据
$ F$ _' u+ l7 {* H2 } - recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
$ O7 }* r7 b% M" k# F1 i - printf("to me:%s\n",recvBuf);2 c7 f2 R% {9 K X1 Q
- memset(recvBuf, 0, 100);
% X' e& k2 t2 e; h. r8 A. u) `0 A - }
" x" p0 T6 O- V - closesocket(sockClient);
( R# A |# ?( Z% r* o" o - system("pause");
( ?6 o! p& D; T& b% ?2 e# t/ ~2 p - return 0;
5 [- o! N/ @! }5 v$ H( P# ^1 o7 w' j - }
复制代码 客户端代码:- [+ F# d; e0 f$ _
- #include<winsock2.h>
# x$ V# P3 ^8 ~8 Y" H: T9 _ F: _7 d - #include<stdio.h>
. S4 o% G! U* E: V - #pragma comment(lib, "ws2_32.lib")
4 o! Y3 l6 C$ q4 U/ J: O" e7 n - void main()
7 a6 ?) Q) f7 W - {7 v" H6 k. W: n5 X7 z) Z7 v
- WSADATA wsaData;
, f9 u3 ~. \% r0 v& A. e - SOCKET sockClient;//客户端Socket
$ p: \; Q* C& p, ~7 | - SOCKADDR_IN addrServer;//服务端地址 v; o5 M9 Z; Q4 M1 ^& l) f
- WSAStartup(MAKEWORD(2, 2), &wsaData);
3 o7 W2 T5 g' Q, d; w2 O - char message[20] = "HelloSocket!";
! Q/ ~1 Q- e: [5 P - //定义要连接的服务端地址# A# `$ _0 M1 @& D0 C
- addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
2 k, }3 \+ g* q+ S# e! s. Z - addrServer.sin_family = AF_INET;
8 A2 X, V7 ]9 S% S - addrServer.sin_port = htons(6000);//连接端口6000
, ]" W( h7 ^" {) a' [( z/ l& z2 v - //新建客户端socket
4 b. u* Z& i9 V2 b) B' \ - sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);$ L) M/ C2 y; x) i4 w6 R5 }5 Z* |
- int s = 0;
( J0 {, a( F4 K! w" c% B v6 n8 } - s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
w) [# {- U/ ] - & w: }; a9 U3 t4 D
- while (1){
7 a2 K9 j [( C6 c - //发送数据$ W$ {4 W- U- F, j5 A
- int a = send(sockClient, message, strlen(message) + 1, 0);
) ]6 G: l( q; v! `+ F5 d - printf("to server:");
1 G: o6 P4 z M( K0 z( N - scanf("%s", message);
/ z) w# r0 \4 I+ l
4 B7 ^& Q2 r$ G' H- }
/ l" r# J. `2 s6 t - //关闭socket/ k* j C) Y! [# X4 D5 B
- closesocket(sockClient);
; p( |, a9 K7 {4 V1 j2 h - WSACleanup();* H# W6 V, Z% P/ y, x' H0 P7 ^
- }
复制代码 求懂的高手来解答一下。
( ]$ F; Z* O: f# S' J6 c谢谢了!/ k. N' |) Z2 ?( l9 P5 ^( k
1 `. y) R0 T, J$ w
; @; v1 M q% w( R/ k. ]
0 u& n# T" s! f, V2 f4 h5 U) Q |
|