管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
大家好,感谢你的回复。
* G9 V1 W0 I1 W: a5 E, X1 E& u我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。) Q7 R' Z/ r/ \$ Z
Talk is cheak , show me the code.9 [8 X. N4 }: R% O& F! k
服务端代码:
& K$ M' }0 B/ k' q) J6 k- #include<stdlib.h>( q* r; l5 D9 o: F
- #include<WinSock2.h>* ~: k D5 U% p9 f
- #pragma comment(lib,"ws2_32.lib")
0 i2 s; c- v& Q: k) [ - int main(){
5 l2 J& J( Z- ?' s+ Z+ e& Q - WSADATA wsd;
3 f; o$ P. Q7 [' w4 u, t. C - SOCKET sockServer;3 `' K# `6 P! I2 R. C s
- SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号: w! E6 k0 }' C( M# u
- SOCKET sockClient;- d6 q" i6 I r8 K1 y
- SOCKADDR_IN clientaddr;! X4 |, R4 {2 ^: a6 h
- WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
( b2 @& c4 p! Y" I" C1 L+ `% ^) J; l - sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket0 n/ j8 j. G5 k- G# }
- , I& c) d u7 T7 @: t, F
; u4 v) G8 Q5 r- if (sockServer != -1 && sockServer != INVALID_SOCKET){
" t. f; f9 H/ e - printf("Socket has been created :%d", sockServer);
+ q9 `& G- n3 {& g" F6 f' R+ u. } - }
+ I" b( g7 k/ x5 n& X: S( H - else{
6 G+ Y! B+ M6 Y7 z - printf("Socket create failed.");
* D) f2 a7 C4 {4 U4 ]" C - exit(0);
$ @+ q5 c) }2 X# x - }
- Z6 f: @* \/ l1 N. k) R - serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
. K9 E/ M2 e: k- T1 ]" o# W& |$ d - serveraddr.sin_family = AF_INET;* ], b9 m4 `. D7 G
- serveraddr.sin_port = htons(6000);//绑定端口6000' p2 | T0 F) d
- int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
; z4 y6 m: f( ]1 N - char recvBuf[100];
, ^8 u7 @8 f( S1 p - int len = sizeof(SOCKADDR);
1 n& s, _5 i: t% [5 T/ P W - listen(sockServer, 5);//5为等待连接数& V. V! [7 I/ d J* ]
- while (1){, X" c# U# @5 r8 ]8 O- g6 J2 n$ o
- sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);$ K6 t. R8 [7 \- v& o/ \' i, T9 d
- //接收客户端数据6 x. F) @2 L% ^8 [& Y% H
- recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
. Y! F( h2 P. Q! r$ o& A - printf("to me:%s\n",recvBuf);$ v" B# A3 ?3 V. F7 q
- memset(recvBuf, 0, 100);/ b. h* s/ l+ O$ Y5 d
- }0 h' R$ W; E+ S" f% g+ D9 V
- closesocket(sockClient);
& E9 O) W& h, P5 C1 ?: a - system("pause");3 M. e3 j. e9 G$ h9 q$ b# A% e
- return 0;
7 Q4 k O o' { w - }
复制代码 客户端代码:
* |/ J% Z* r7 d$ Z* U- #include<winsock2.h>* Y) n/ P- f1 \ N) Q6 b7 V
- #include<stdio.h> t9 {5 h$ d/ J* L
- #pragma comment(lib, "ws2_32.lib")4 h* m: F6 n0 n. _# ]
- void main()
z% c/ q. A h, r - {) h5 _5 j- w/ f! X
- WSADATA wsaData;
/ x2 ?$ `* k% k6 N$ W- L. ^. o4 O - SOCKET sockClient;//客户端Socket' |9 K: `% W! k$ A
- SOCKADDR_IN addrServer;//服务端地址2 p4 u1 ?) Q8 J/ a" Z! z* v
- WSAStartup(MAKEWORD(2, 2), &wsaData);" T& F- r: n' O' h; E. }
- char message[20] = "HelloSocket!";7 K. A8 B `; p, ^
- //定义要连接的服务端地址) l o! n9 J* M- \" h! V6 E# }
- addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
$ R: k" u% ` h' H) M3 y1 G - addrServer.sin_family = AF_INET;+ K2 [* M5 q" V Z1 {: o9 p
- addrServer.sin_port = htons(6000);//连接端口6000
' l3 K9 L: j: {7 T0 q1 J6 K - //新建客户端socket
/ ]9 s% Y$ N% q: e - sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);1 \9 |' V( \! i( x7 p* R
- int s = 0;
/ |7 [ z) ^! W2 A! m' m - s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));( W& p, d; H" b( e
9 h' z% G: O% X2 Z% V! E- O% Y- while (1){
7 J. B6 q3 f8 T! P" |6 ?# R! q - //发送数据/ J0 F* {1 E% [" }9 p6 ]- i1 A& q
- int a = send(sockClient, message, strlen(message) + 1, 0);$ J d2 K, D9 X1 l
- printf("to server:");
$ D4 h5 p) l7 O$ P% ]' M8 X - scanf("%s", message);
, Z2 @& |, h- \3 p - 8 z8 A: n( ^1 C- C/ h* Y
- }
2 G0 ?$ N5 H# b - //关闭socket
1 `/ y9 R1 n& A( }' a# m& | - closesocket(sockClient);
: `5 y q, }7 l, S( l - WSACleanup();
/ E0 b# I2 G& o0 u" R$ S" m! H+ H4 ? - }
复制代码 求懂的高手来解答一下。: c$ S0 T% u5 l' x% I
谢谢了!" G8 k$ |2 b2 T2 }7 T1 H9 a
p2 \0 L5 h. l6 m" |
# s( {3 v, c8 M0 H2 N% s. {, S2 `& |8 ?0 l, ~
|
|