管理员
论坛积分
分
威望 点
贡献值 个
金币 枚
|
大家好,感谢你的回复。1 | d ?+ O+ U9 ^0 R3 Q+ y8 E+ I
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。& N8 V- \. r- M: F9 {
Talk is cheak , show me the code.6 P9 D6 ]8 f) W/ m# n" ?% |
服务端代码:
) V o- K5 ~& f/ k7 }8 s- #include<stdlib.h>9 c, d" `9 J# y8 a+ y( m; H+ R
- #include<WinSock2.h> S( \1 ^- z( ]) _# P5 }/ H0 x
- #pragma comment(lib,"ws2_32.lib")
0 q& I# z3 a3 [3 O- c0 I8 e6 z$ T - int main(){# E: T `! L* V% [" k
- WSADATA wsd;! r. t& p7 y4 o0 G
- SOCKET sockServer;
; W+ H P( K% p" S* X1 o# E3 v - SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号7 |6 Y! k, T n& W2 W
- SOCKET sockClient;
N0 z( ~) g% l) g( E1 ]8 W% [ - SOCKADDR_IN clientaddr;
3 S3 f" D9 E+ g/ N. R7 {- ~9 R; T6 z - WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口: y w/ |, N. J6 I6 k# e. x
- sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket! @. ?5 P |9 v) v- X
- ! L% Q/ S$ ?9 y4 @
- * R. p+ ?- J- v6 @8 p' y
- if (sockServer != -1 && sockServer != INVALID_SOCKET){
5 F2 [. L7 v$ b; w - printf("Socket has been created :%d", sockServer);/ d9 M7 z* N4 o) h/ p
- }& I+ _3 J- f. P. k9 k% f. @
- else{
' b' z; e9 | R! o7 w - printf("Socket create failed.");
4 d O( \: `+ a6 u. T, c% T& s/ j - exit(0);) M5 q5 A( n- f% ?5 P0 ]
- }% W' t: V" L+ Y7 R/ I. T: N; a
- serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);6 w( r4 W6 X' x6 H; y, u
- serveraddr.sin_family = AF_INET;
$ T( B& o O: v4 R& l - serveraddr.sin_port = htons(6000);//绑定端口6000
$ S z- L( D7 [- g' r' |% ^ - int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
& ?# d2 j4 l4 h: a6 U& D - char recvBuf[100];
( _ e' G8 p5 Z9 {; O/ n4 w) h - int len = sizeof(SOCKADDR);1 a+ S& f$ `3 @3 i
- listen(sockServer, 5);//5为等待连接数& \/ t# Q. g2 [
- while (1){1 e# V# K) i9 }1 x& @ y
- sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
- ~. d; M3 H2 w! x9 Q/ V - //接收客户端数据2 g* Y) o- ~4 r! U) D- N; h
- recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);. v: ~. i8 f7 e7 q+ \, y
- printf("to me:%s\n",recvBuf);( b, N0 f3 ~* y1 G& r* X
- memset(recvBuf, 0, 100);
: _4 R# K }8 c1 j- L7 B4 x8 W - }
. I3 L+ ~1 G# n1 |6 A! a$ `) p7 ^ - closesocket(sockClient);
/ c/ o" `* H; c* c3 \5 e @/ T% U - system("pause");# i6 i7 W! r3 d' h4 l+ r8 Z
- return 0;
$ o( h1 w& |3 ]3 k4 c! q* v - }
复制代码 客户端代码:6 f: C. T4 v: f! k4 _4 w
- #include<winsock2.h>
5 H; o8 K" S- n2 h! h. t4 k" D7 L# M - #include<stdio.h>
& i5 ^9 D2 h1 ~7 ~0 {; D) j1 g - #pragma comment(lib, "ws2_32.lib")
, K* Y Y' q n+ p& a - void main()
5 }4 P, _' N5 {. x- p - {
- r4 a z- r4 q2 `8 ] - WSADATA wsaData;% X1 E/ U: }( q+ N+ }( ^3 E
- SOCKET sockClient;//客户端Socket4 C" ^+ \* n3 |5 }# [2 v" S9 Y
- SOCKADDR_IN addrServer;//服务端地址9 o1 x! X" f) @+ n& v, b
- WSAStartup(MAKEWORD(2, 2), &wsaData); p* n7 y3 V, k, p9 h4 x+ {
- char message[20] = "HelloSocket!";
, \+ y3 `( k! j, W' g3 ~6 A - //定义要连接的服务端地址* V1 P( z6 ^- U# S" B: n$ e1 J
- addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
& O6 _* B5 W! [ - addrServer.sin_family = AF_INET;
! @ K- O9 H. B/ K0 z$ a9 d8 L! B - addrServer.sin_port = htons(6000);//连接端口6000
: `( h+ b F- F! k5 _ - //新建客户端socket
- G$ D' Z i6 s- J% W0 h - sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);1 r0 j, E- L& O# u& F
- int s = 0;" k/ E2 G8 T! }& U
- s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
5 ?+ ` Z$ p& Z& D$ S' ?- Y$ I
1 `* G! _2 _( L) L) v) j3 R# J- while (1){9 @7 I0 ?, O v
- //发送数据% K- E% T' f& q; F% i2 q
- int a = send(sockClient, message, strlen(message) + 1, 0);. C# o+ e; m% F3 Y2 u" Y
- printf("to server:");
3 e7 b1 n* y; O* B% T9 h7 S - scanf("%s", message);: _, O0 e, e2 X/ S
- + c1 w. H( f( A$ @5 l6 W) ~ u$ D* \
- }8 J' ]/ f8 M3 Y/ p0 I+ N
- //关闭socket2 K8 `; t3 P3 f+ W$ e2 L; P# R
- closesocket(sockClient);+ E+ |, i# M1 g
- WSACleanup();, B2 X! |9 ^) g* c1 S) ]
- }
复制代码 求懂的高手来解答一下。. v5 ~1 ?, m9 u
谢谢了!
# f! x& l: m- z8 R: E
2 N$ K9 F$ ~4 b7 i8 B/ b5 L7 Y- B/ A$ G
' u! \7 [6 y% L; A8 r7 I
|
|