管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
大家好,感谢你的回复。
: h+ n+ r/ V" \- w! r: q# p, d我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
: f. `9 i$ h4 _: |9 JTalk is cheak , show me the code.+ u, s% X2 o, z% Z
服务端代码:. h( u I, f( A
- #include<stdlib.h>
9 `: l" K. \6 ]. Y2 w8 s - #include<WinSock2.h>
3 Q# N2 {9 H) R/ Q6 N% C - #pragma comment(lib,"ws2_32.lib")
* ?/ y/ I. l( J8 U" z3 o - int main(){
: a; L& o% R2 N6 }- w - WSADATA wsd; m! I/ {+ b0 p5 y5 ]
- SOCKET sockServer;
/ Z" b' [, G' `4 Y5 c u - SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号. t X- o2 Q5 {; j0 v6 H9 x, u
- SOCKET sockClient;
- f" v ?% [6 N - SOCKADDR_IN clientaddr;
* A+ @' g6 K2 ] V - WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口* \* F; t; @( Q1 x
- sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket2 R f) U5 N& V7 T7 L! c
- ( X* Y0 p4 o$ t& }* y5 j; F( r
- $ z0 c! S4 i/ G( H& w0 a. U
- if (sockServer != -1 && sockServer != INVALID_SOCKET){, `5 X; y& a ~$ \0 F* L
- printf("Socket has been created :%d", sockServer);3 y( ?( k [9 h7 C! }& H- a4 q
- }
% [% S8 \! }# _ - else{
: }' }: l3 V% i - printf("Socket create failed.");' Y% J4 q% W% [: C$ I; p
- exit(0);
. R1 m# U0 @) G! u/ A - }& a0 |/ Q3 n% _0 v$ y2 q7 R
- serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
7 e' v0 Z8 Y6 l - serveraddr.sin_family = AF_INET;' u O$ |( ]7 p1 w: b8 w
- serveraddr.sin_port = htons(6000);//绑定端口6000
. c) b8 w# Y( s5 |( C - int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));3 @$ A$ e4 r' o, s
- char recvBuf[100];
3 r2 p- X* R4 v; d! X - int len = sizeof(SOCKADDR);( K1 a. ?# H. ^7 q& P- J9 U
- listen(sockServer, 5);//5为等待连接数( `4 m/ w% y; s5 s
- while (1){
/ ~3 Y' R% e7 [) B6 W1 j# ~6 _ - sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
- d: S# q; l% W* G9 ]$ J- e - //接收客户端数据& w* L4 ^/ e O) F: ]0 j$ x6 a
- recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); c6 f: ~0 O% m9 J' Z
- printf("to me:%s\n",recvBuf);* {% ?) b5 J, E
- memset(recvBuf, 0, 100);
) C* R' [- Y! Q1 p) e$ { - }
1 x3 j# P) e+ N b# ] - closesocket(sockClient);
6 e# {, k9 G$ J- t2 ?, p - system("pause");
8 M( ~8 B; e: a9 S/ I - return 0;6 V2 R' M8 Y. W7 X
- }
复制代码 客户端代码:% W) H+ @8 k/ F" m( c) y
- #include<winsock2.h>7 w: G2 o3 @" t4 F
- #include<stdio.h>6 K G4 j% f: {) ~* |3 W b4 {
- #pragma comment(lib, "ws2_32.lib")
4 S( \( ?9 _% P$ X2 ? - void main()6 P1 i% U: J0 l# T2 Q T# J
- { g% e/ b1 {0 Z
- WSADATA wsaData;( \& E+ a, H. z4 q9 H' T
- SOCKET sockClient;//客户端Socket7 j) P& K- D8 ~+ M* M% y
- SOCKADDR_IN addrServer;//服务端地址
# A. |% U0 N; ~& P- X9 A f( p' s - WSAStartup(MAKEWORD(2, 2), &wsaData);
7 c! V5 l2 O) l' ]9 C2 ~& J% }9 O - char message[20] = "HelloSocket!";
. L8 }" X0 ]: l N) `: W - //定义要连接的服务端地址
! n5 ]/ B9 V4 S9 |' n - addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)( H; C9 T' f3 y) ?1 k$ F+ M
- addrServer.sin_family = AF_INET;
- k0 a+ m& l% S6 y. D+ q - addrServer.sin_port = htons(6000);//连接端口6000
! Z5 o" ~$ c! D$ A7 w - //新建客户端socket
/ `' ?! E. E9 Q3 P, ^ - sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); o! w# i3 n" G- S5 t2 w' R( ^
- int s = 0;
3 J; K- t- l% \8 i" Q9 u - s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));, z1 E+ @+ {! d
- ) f0 s, M. E* o3 N
- while (1){
$ ~- p1 d+ }9 H; [ - //发送数据
* ?3 g8 e# C; Y/ C) U$ M0 c - int a = send(sockClient, message, strlen(message) + 1, 0);0 x+ k- _! j* u9 T
- printf("to server:");6 B" h) H% B7 B8 k
- scanf("%s", message);
" i* P$ ~! s( R, E' M1 {
# {5 d+ \$ Z# e9 Y- }/ u6 [+ {) r) P7 W/ A( K
- //关闭socket3 G% d! |2 X* {6 D% f1 \3 l0 k
- closesocket(sockClient);
! G% M ~2 p- a - WSACleanup();/ ?: e) ]1 X8 u _: T
- }
复制代码 求懂的高手来解答一下。& M5 e, g& {& K3 j+ K/ d/ D' \" e. q
谢谢了!& v; k) \1 o# e) f2 ?% L. P
- C# j: R4 H6 ]) ^8 k
! Z4 s" j* P% X% ~
" O1 |( `- d% a2 k" C7 h |
|