管理员
论坛积分
分
威望 点
贡献值 个
金币 枚
|
大家好,感谢你的回复。% p Y1 j: ?7 I9 }! ?0 e% o
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
0 A6 J8 e. k; ~5 r0 w+ Q" TTalk is cheak , show me the code.
. {# [, m; }3 O r c! @服务端代码:
+ p' [. T H+ O. U- #include<stdlib.h>
0 _( A1 v0 H! ]: p - #include<WinSock2.h>4 `) I! G3 d, E) }6 h
- #pragma comment(lib,"ws2_32.lib")
0 q$ [! R3 E8 O* |# U - int main(){
3 E$ U$ \$ i* v' y - WSADATA wsd;( {7 c# A( s- [' R
- SOCKET sockServer;
0 u# T# x. c2 S5 ^! `; V - SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号3 J3 y/ c2 o% V. g. _
- SOCKET sockClient;; _+ r4 E" J* e6 ^( a" ~
- SOCKADDR_IN clientaddr;4 X5 I5 j q, L7 ~; [/ s2 V1 I
- WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
. x/ _$ e; p4 `5 a' g% r- t - sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
6 }$ p, Q- A0 W' u- ]
7 c% ~) z, \1 X( n: L) ?
$ X u! ?5 R6 Z& A( O& M- if (sockServer != -1 && sockServer != INVALID_SOCKET){
" b; a* s8 P1 @ - printf("Socket has been created :%d", sockServer);
; p3 D7 y& N+ f* s - }7 A3 u% [2 x+ x4 _ t. q8 o: ~
- else{ v) f& E: B0 H) j. v! o
- printf("Socket create failed.");
3 V) T+ g& p3 e/ [/ R& s - exit(0);/ g T. X D& o! G) `$ C
- }
* {+ l' d- M& g2 S I: @ - serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
7 j. N i3 q+ t4 { - serveraddr.sin_family = AF_INET;
3 X( B- P9 z) v( i/ f2 D+ ^ - serveraddr.sin_port = htons(6000);//绑定端口6000, H \0 J" L! n5 A( P
- int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));) J% y& l/ N' R! {; l
- char recvBuf[100];
0 j9 N7 h4 h- I4 f0 B; y/ j2 g! X - int len = sizeof(SOCKADDR);
& r8 M- g# z) j1 {' m. A9 u4 F - listen(sockServer, 5);//5为等待连接数
: H6 v9 Y, F- { - while (1){
. \; d/ g: S. x& `$ g - sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);1 ?$ K8 L u! P* q/ a4 O) Q/ k5 K$ n
- //接收客户端数据8 d4 q4 g/ L. K& g
- recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
, \4 O1 ?$ w. [& f" E; q) u+ }2 Q; d - printf("to me:%s\n",recvBuf);
3 q' q$ w4 [7 {9 u0 @ - memset(recvBuf, 0, 100);& ~# B5 D0 J/ t
- }/ R x4 f2 T7 y4 Q" p, n; t
- closesocket(sockClient);% e9 P T; ?0 E. L
- system("pause");) k. q" G/ z! O8 n4 L7 _) D0 p! A
- return 0;. ~. P6 G7 Z% g7 b4 i
- }
复制代码 客户端代码:
6 w$ H, k1 a+ _' P e& B- #include<winsock2.h># V. Y7 [& o: ]4 |2 ? t
- #include<stdio.h>' R: w4 n+ y1 V
- #pragma comment(lib, "ws2_32.lib")
6 [0 h3 n+ g; _; e - void main()
z* @' L n8 {2 I& x - {
- K* X; N9 [$ e6 D - WSADATA wsaData;( `; S! L/ f9 x5 P$ q \
- SOCKET sockClient;//客户端Socket) q, V! f3 [# Y( e, Q1 G4 J; r5 O
- SOCKADDR_IN addrServer;//服务端地址
V! s @& i( u; E# X0 T7 B - WSAStartup(MAKEWORD(2, 2), &wsaData);
8 b, S! H, B. q! ^- s3 w/ \: l - char message[20] = "HelloSocket!";
1 R$ q0 j7 @" V1 d. I2 G - //定义要连接的服务端地址8 V9 N% g7 E* }5 C u
- addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)$ [: U& s5 t, T+ m" L' y3 M; ?
- addrServer.sin_family = AF_INET;2 A. |# Y: e) }: F6 V/ @ c( x
- addrServer.sin_port = htons(6000);//连接端口6000* `& E8 w' ^6 d# Y y% B
- //新建客户端socket G; r, }3 O; Z% I/ X
- sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);% O& L1 X, V6 o* ~& A3 n
- int s = 0;
5 G7 e; @- h: ], S" `5 x - s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
, ]7 P) t2 s5 b$ u1 O - ' `3 ^/ ]6 I5 h$ Q! v0 ]! z
- while (1){: R& S, ~& F( Z/ r( R7 D
- //发送数据
. w6 O7 \3 ~3 R9 b5 y9 X$ u - int a = send(sockClient, message, strlen(message) + 1, 0);
# K1 ~5 T: d- l+ g" N8 z4 [; z - printf("to server:");$ Y+ ~! I2 z, w. f3 c
- scanf("%s", message);
' k, b" z* N7 k* d - $ d7 M6 j s$ I! y; l; a
- }) `2 S q, L& ?" I
- //关闭socket1 W5 D- |2 `! L8 `& i
- closesocket(sockClient);
8 r+ J! u& b# |+ m ^& k2 [ - WSACleanup();( s4 H. J' Y0 e
- }
复制代码 求懂的高手来解答一下。& H* {' @8 P# |" E* W' [
谢谢了!0 u: I% t) J& t( s, R V4 E; i
$ F3 } n+ F1 n. L2 ^& [1 v' r0 t6 ^
0 g" w9 V- A& W9 D$ H* N, S
|
|