管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
大家好,感谢你的回复。- J6 W# [! Z! Q( D
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。! o0 u" f/ i, \; X
Talk is cheak , show me the code.
( j# s6 e1 \- D: ?2 b服务端代码:
; X. w ~3 p w* m- #include<stdlib.h>
3 V1 |* k5 b1 [3 p - #include<WinSock2.h>5 d1 n: S* W4 w$ U
- #pragma comment(lib,"ws2_32.lib")
) {3 [0 r3 }1 H8 c+ J9 {9 s9 @ - int main(){
. @# _% k+ y4 Y$ G/ l1 [3 r - WSADATA wsd;
/ e' i5 b/ m. f - SOCKET sockServer;
/ T4 w( J& M2 C% b5 w% I U* ~0 s - SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号& H: ]; F( s- q7 }. Y# ?, J8 Y
- SOCKET sockClient;
0 I2 {, [, S3 a" ]* U& d - SOCKADDR_IN clientaddr;
c" m7 M! j4 @0 E3 ?# J' G - WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
6 }$ p: d' E7 h) @; u, d - sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket3 H9 S8 y7 M9 `4 B
- 8 ~* X$ ~0 [8 a' R- {, W9 d4 Q* d
% ~# q% d: a( N% o- if (sockServer != -1 && sockServer != INVALID_SOCKET){& Y, o: G1 d: Z/ s5 b* U: N/ Z; L
- printf("Socket has been created :%d", sockServer);
+ E3 H5 l+ W1 E% z, j3 r: @7 c - }/ \2 }. `* y- c: q% `5 E
- else{+ R. s, i. i/ V* B1 V$ P( w$ J
- printf("Socket create failed.");! Y+ x5 }# A% D
- exit(0);
6 |# y9 I! V- v& w - }
& R" Y* I( p6 v. C0 @8 Q2 U - serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
9 |) Q2 z7 e2 \$ N - serveraddr.sin_family = AF_INET;8 E3 A. q/ s% \9 w0 u! p
- serveraddr.sin_port = htons(6000);//绑定端口6000# | N; T# V8 j
- int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));8 u' `% S9 k- L6 w
- char recvBuf[100];3 ~. b& _9 S5 G5 ~
- int len = sizeof(SOCKADDR);
& D8 t5 p; u3 J( Z- u2 S - listen(sockServer, 5);//5为等待连接数% @8 H M% T% m
- while (1){% |! Y: w, R; |, [% H8 c
- sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
0 R5 U& g; p! \7 Q - //接收客户端数据5 u: E E. O) J/ p8 ~( |% Z7 s# T
- recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);' E& J m/ u( B" s
- printf("to me:%s\n",recvBuf);' w# R. w. y" O1 S4 O& y5 O2 v+ {9 S/ }/ }
- memset(recvBuf, 0, 100);
9 _+ d i% e0 q- [2 _ - }# `! A) Y" H# U" ~4 J- |
- closesocket(sockClient);; x$ L) `4 V1 j5 J3 R, r
- system("pause");" S* A3 {! n) [$ I% _
- return 0;* m1 e5 g( x% ?7 O- P
- }
复制代码 客户端代码:6 L& M8 h- K3 ]8 S9 e2 e
- #include<winsock2.h>4 q9 A+ h/ i5 |( b5 A) g$ U: L% w, K
- #include<stdio.h>9 k- e- K# {& |: R# G, {3 ]. m
- #pragma comment(lib, "ws2_32.lib")
0 h$ m6 @2 b, k- Q* H L - void main()
5 Z+ G n/ E$ E, X" m% p - {2 g# L, T) ?- ?. _1 t$ W- x% u
- WSADATA wsaData;
$ \1 Q# D# K) L3 v8 E - SOCKET sockClient;//客户端Socket& i, w& F6 o' j( w" c1 j
- SOCKADDR_IN addrServer;//服务端地址
8 T4 o) W7 T. s1 G9 V3 ^7 _2 j - WSAStartup(MAKEWORD(2, 2), &wsaData);- \2 N& f) B5 J n; W
- char message[20] = "HelloSocket!";& s. `' B2 e1 `) Y5 r5 e
- //定义要连接的服务端地址& Z0 |- N5 S8 @, n. w3 z
- addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)7 L6 P4 P& Y. C6 e3 j2 l8 H
- addrServer.sin_family = AF_INET;
' f2 E% e/ L) u: h! X - addrServer.sin_port = htons(6000);//连接端口6000
* S. g( G0 }: }* E - //新建客户端socket( e& E% R4 g& }2 A
- sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);4 n/ U( F0 u: S- L& ^) J
- int s = 0;
& Z% I+ Z" Q$ C9 D* V' K% i" H - s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));2 ]4 R8 a% t g! u$ e, N
- + L' y0 M) I! I7 h, ?) }
- while (1){1 @# o0 \7 y3 T5 U) ~
- //发送数据* K: y9 z* j4 i+ B
- int a = send(sockClient, message, strlen(message) + 1, 0);9 d$ T( L- j" y" n4 p$ T
- printf("to server:");' e7 V. G2 }/ q0 W) ^6 _. Q* g
- scanf("%s", message);
- u: E& u! T# d7 s8 h5 E - $ X4 S% B4 |* o! Y7 P2 c: L
- }: ?5 @" T- S* D3 ~
- //关闭socket
! ~1 C2 y! `1 c) L$ D9 R; f& y - closesocket(sockClient);
( i; V9 g! w. n - WSACleanup();2 ~3 R& z5 y+ K& P1 B
- }
复制代码 求懂的高手来解答一下。 z2 z; E0 v. z; }9 B5 I) g2 h+ @3 `% w
谢谢了!
* L% X$ P( h% i; m
( M" w$ g/ l# J8 M7 T8 q* ~/ X8 f( q/ o7 H+ U0 I% _
& r( |$ q+ z9 D, y! S5 G* ]4 g |
|