管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
大家好,感谢你的回复。
- x( A! y9 s' L! U% ?% `我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
- W+ G$ B8 T* f! R/ mTalk is cheak , show me the code.
8 q( F/ {) F! R! v" ]( T; t- H' I服务端代码:3 r$ G) Z# u9 t/ K* J: y
- #include<stdlib.h>
9 w2 ~: x& e/ z% E. k7 c - #include<WinSock2.h>, z8 Y( ~2 x- D- o* S) E$ {/ \
- #pragma comment(lib,"ws2_32.lib")
5 Z |+ z& _. S$ P% ^/ D' w2 f - int main(){7 ^4 S8 \- @2 L2 L, ^
- WSADATA wsd;. s8 J% G& ]( n' K; ?' Q: O" }
- SOCKET sockServer;; G/ H; ~) R6 [+ C
- SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号. y4 F# i+ G( w: P8 F
- SOCKET sockClient;' C4 v, y$ F) j6 \
- SOCKADDR_IN clientaddr;
/ ~/ o7 }) r5 p6 ?2 y - WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
6 ?$ Y' c# O5 _- A9 u& g9 {1 N - sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
1 r6 R$ ?" G7 C- v - , {" W' h; `( j) v
- f8 z' c$ K7 j* `; L1 R- if (sockServer != -1 && sockServer != INVALID_SOCKET){; R b) p. \/ ^5 B, r
- printf("Socket has been created :%d", sockServer);
7 f3 n0 l/ O4 F, y8 d - }* t% y, r6 S3 l4 F& ~4 P E# V
- else{
7 w2 A/ c5 T+ v3 i - printf("Socket create failed.");- C; S& d3 _+ l& J* ]
- exit(0);+ T$ t r0 F) C1 m" W3 A: e/ o! ~3 E
- }3 o; P/ q: W1 i( `* L
- serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
% P8 m6 l/ h% W$ f) b1 K, {' H - serveraddr.sin_family = AF_INET;
2 d5 M. O5 o' ~/ }3 W. w3 t4 q. k - serveraddr.sin_port = htons(6000);//绑定端口6000
4 O9 K. A6 X; @ - int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));' f$ d( T. c. i0 v% S" ~ e
- char recvBuf[100];
: p) y) }. g/ \9 T; X3 R2 f7 X - int len = sizeof(SOCKADDR);) T; w& B0 D' e( h) P
- listen(sockServer, 5);//5为等待连接数
4 j1 l/ o2 `) q$ ?5 D' y" d - while (1){' e2 f, s; Y5 J8 u+ w, q
- sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
. U( h+ j* \ Y3 v - //接收客户端数据( y' v# a4 z& {8 a ]4 f$ F8 j0 h
- recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
6 U2 x7 U, b l9 T* l4 X8 C! m - printf("to me:%s\n",recvBuf);) g. @8 G3 q2 p C4 c6 A- d' b
- memset(recvBuf, 0, 100);
. F, M1 Q1 D ~8 m4 h' n% ~ - }3 c$ A% Q1 L: |3 K' e
- closesocket(sockClient);
! I( B" h4 R! i9 l* M. _ - system("pause");( F g) k; z6 O4 O, q8 N: C, r1 W
- return 0;
?, d; R1 L4 ~( c( X' H0 _6 ]! h - }
复制代码 客户端代码:" _! C$ O: H( N
- #include<winsock2.h>9 U! J& u8 E; v! U8 X
- #include<stdio.h>+ T1 C7 r6 Y0 _4 p
- #pragma comment(lib, "ws2_32.lib")
v5 Y9 F0 L3 I; R) j$ D8 N - void main()
/ a1 D! Y- q& U$ A - {+ T! o4 ?7 y; d0 D2 Q* S
- WSADATA wsaData;( n3 {8 n# S4 ~# K/ ?7 }; W
- SOCKET sockClient;//客户端Socket
1 F2 a: h( R9 ?8 d2 v - SOCKADDR_IN addrServer;//服务端地址" W* e5 y3 ^9 A( q( B
- WSAStartup(MAKEWORD(2, 2), &wsaData);2 t1 i2 c t4 V- }# _ N3 A# [
- char message[20] = "HelloSocket!";
) v% ? k; B4 |. y - //定义要连接的服务端地址* a1 C C2 O: J0 Z! b. o
- addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
8 ?5 M( @8 _& z" q, U' o* s3 @ - addrServer.sin_family = AF_INET;: n, c* X- x" g1 \* @
- addrServer.sin_port = htons(6000);//连接端口6000
$ V j# Q4 [ E+ y - //新建客户端socket5 X# l6 Y9 R: f
- sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
; X' g# w* x# A7 U9 `6 x4 q9 y - int s = 0;
2 P) {0 x4 S, T2 ?" \, l ^ - s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
3 ?9 a: I6 ^; |0 G1 u - * E) C) G9 }4 E# e2 v
- while (1){
, z8 r0 C, a0 s* a - //发送数据
+ V$ l$ l n4 @2 q! e - int a = send(sockClient, message, strlen(message) + 1, 0);1 [% a; Y- n4 R
- printf("to server:");( |! A* @6 M! a( q9 p# u+ d2 P2 ^
- scanf("%s", message);
4 b; R( Z. @. x5 J* z, J
q+ O; {* G4 d m) ?3 o% ^2 P4 P- }3 s( U$ Q5 [( c9 Q7 ~, |+ G/ j
- //关闭socket
% A& Z0 X6 |! h - closesocket(sockClient);. E' F3 b6 q& [: _- m; @
- WSACleanup();
, I K6 Z* s o* S* } - }
复制代码 求懂的高手来解答一下。
+ M# j& d, m# q谢谢了!
2 [" s6 }$ ~: u1 q. L
% @% A" ~9 N. `: ]) B
s- m% V t$ f0 @! ~6 n6 J
" p% z$ u+ I* \! H' K( f' w0 [ |
|