管理员
论坛积分
分
威望 点
贡献值 个
金币 枚
|
大家好,感谢你的回复。3 z5 \" k5 Q! i7 U) v e! `! s
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。 i; g3 i [2 t
Talk is cheak , show me the code.; F, Y& j* Q3 c
服务端代码:
2 U) a9 k& A6 R- #include<stdlib.h>
4 ?- r% _: z" l2 q, [, e - #include<WinSock2.h>
/ ^. T k( Y9 Z8 c - #pragma comment(lib,"ws2_32.lib")
2 O4 S$ K7 T* c3 S) N - int main(){
0 r5 X) w& U( T$ l% V" a - WSADATA wsd;& ~) h: x" \# g/ h
- SOCKET sockServer;
G( J0 r2 B+ ]9 D - SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号
# }7 `& q5 t6 L+ e' m9 t2 o - SOCKET sockClient;
0 [2 N6 T/ M W - SOCKADDR_IN clientaddr;! F) t0 u" Z" k0 ?
- WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
1 v2 N0 f0 D# `" ?, X/ K$ y% T - sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
5 @; ^8 e% U1 `; L3 l, V' L' \+ A' u - 4 N0 |5 m& O6 h5 c
8 d" \) F p. {% k: z7 |+ a- if (sockServer != -1 && sockServer != INVALID_SOCKET){1 v: f6 P: h% K) ~, K I
- printf("Socket has been created :%d", sockServer);1 [5 j( q$ S I7 A( V
- }
8 W7 e$ h! i, v8 X1 n. V+ F# E0 ] - else{
# i2 ^- F0 l! ~/ `. V$ Y - printf("Socket create failed.");6 n l) O. h" z3 U3 H) \
- exit(0);' m* c+ X9 r& V8 r# {% ~
- }
4 [* g$ l; n; x# T2 _, j) v- s5 w - serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);& m3 }6 a. V2 h9 u$ i) j4 y3 t7 x
- serveraddr.sin_family = AF_INET;
- x6 b. q7 n$ I3 P0 }7 G1 B9 N - serveraddr.sin_port = htons(6000);//绑定端口6000
8 ?: f7 y+ b, f: n) ] - int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));1 f, Q4 C+ y7 S ~ I& P
- char recvBuf[100];
/ v- l p8 v; q# B - int len = sizeof(SOCKADDR);+ i' C1 J% k3 G( X: s2 p7 g
- listen(sockServer, 5);//5为等待连接数) e& Z4 |! ~/ s4 o# t
- while (1){' H, ?/ `8 V1 Q9 k H+ A
- sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);% ?: `( r$ ^' |
- //接收客户端数据0 [+ R; W& J1 u* J: X
- recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
- y) f' w6 i- J* I9 N: z, w, V - printf("to me:%s\n",recvBuf);) g4 s2 A' [/ H) M+ y
- memset(recvBuf, 0, 100);0 Z& a( T( ^( R/ w& U) \
- }
6 J" [6 A* e% s2 u& S H - closesocket(sockClient);
8 ]& R% k3 A' c- u# D! ]; G - system("pause");4 b, {/ c: {8 E# K! G
- return 0;
5 e; A; X( [6 U - }
复制代码 客户端代码:
% S4 l9 a! S# h" [$ s0 S- #include<winsock2.h>2 X$ V' b! X& h' r8 `# p7 M* q
- #include<stdio.h>4 _; V9 O, O% T, o( d
- #pragma comment(lib, "ws2_32.lib")" u+ o& e( H* O/ t
- void main()6 d t( N( b+ o) F
- {0 ]5 {- F+ }5 T% k1 P2 z
- WSADATA wsaData;
4 o; N- `2 m5 z+ z: N: E1 g - SOCKET sockClient;//客户端Socket
% }% M0 z% o+ { - SOCKADDR_IN addrServer;//服务端地址
9 d' Q7 ]: }2 { - WSAStartup(MAKEWORD(2, 2), &wsaData);
7 n, H8 H, q7 s+ W# p# q - char message[20] = "HelloSocket!";
! r& S0 K9 Y& T7 t6 s. X - //定义要连接的服务端地址1 T: t1 u! x* M$ `) L+ u5 |9 {
- addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
+ r/ C6 ]7 }# I$ N$ I% j w - addrServer.sin_family = AF_INET;
+ c' K$ ?* @2 \" b7 { - addrServer.sin_port = htons(6000);//连接端口6000
9 C: p6 U% Z3 U0 T, J9 A* o - //新建客户端socket5 _, Y! q* H! X3 i) t7 N
- sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);) j9 ^1 s3 v3 _. y6 M4 J
- int s = 0;
; d2 A0 i$ \5 | - s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
, x: s* I. ~" W - 6 g, m, t: d- \6 ]. z: M1 |: D
- while (1){
2 [+ l$ R! Q5 B - //发送数据
/ H+ q* g: c& i+ d2 w - int a = send(sockClient, message, strlen(message) + 1, 0);
- Z1 y1 `; m. t' Y9 j1 C& P - printf("to server:");
( s# T0 V' }) t7 S - scanf("%s", message);* \$ }1 y# @8 Z
" l! a+ C7 L9 ]' E: }" H' Q- }
; Z z/ w0 N7 I - //关闭socket
& U) Y: E0 j u - closesocket(sockClient);
4 k. @" ]- ~# Z- `9 P; B - WSACleanup();
9 u9 u, Z! a) b( T - }
复制代码 求懂的高手来解答一下。
7 M' M* u# ^( P5 {谢谢了!" e# e: Q" b: X
4 E$ Z% ]1 O+ z. x8 c+ b% S* k- {4 ~ j1 G1 R1 j! h
4 \# f" s. m0 M! p* E' ~) P
|
|