管理员
论坛积分
分
威望 点
贡献值 个
金币 枚
|
大家好,感谢你的回复。
* v3 [/ [; P" a: Y! m- ]% Q我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
! i" B6 j* D! b7 W) R. fTalk is cheak , show me the code.+ \ k. B3 F* l
服务端代码:
2 s. ~8 O" \$ Q. o* @* f- #include<stdlib.h>
8 L# a5 x- m* D- n+ D* u - #include<WinSock2.h>
6 r6 G* B6 H& L. c+ p. K - #pragma comment(lib,"ws2_32.lib")
- O+ B& N5 ^3 ^( F; Y. T& N - int main(){* d: x! S9 G' T8 }% J4 z
- WSADATA wsd;/ s1 H' {7 u* b& E8 |7 q- |
- SOCKET sockServer;2 {; r% v: U4 Z" Q3 [, M& X
- SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号' X/ D4 g: |+ G1 O% |
- SOCKET sockClient;$ l# o4 J0 H4 m7 O8 B5 j0 {5 m
- SOCKADDR_IN clientaddr;% K! c/ c; C. K) ^' W0 b
- WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口* f+ G$ E, |) f5 X8 Q5 d
- sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket7 Q5 e! T5 }% k1 q. L
2 t0 z9 t: B* M
! L4 M& |4 ~8 p$ _' y; v& V+ b& R2 F- if (sockServer != -1 && sockServer != INVALID_SOCKET){# `8 h4 Z' F2 e
- printf("Socket has been created :%d", sockServer);
6 F3 ?6 P7 q- Z - }
2 `+ n. x/ ]) c& h - else{
& g* W1 m* I+ o5 c( H - printf("Socket create failed.");
( ~) j$ n$ W. p$ C; y2 P6 R - exit(0); f, m( }" l/ Q l# z/ ^ H
- }& `& {$ L- M0 ^: J
- serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
; b7 G' ]* }8 a# ?0 C$ j - serveraddr.sin_family = AF_INET;
: n3 ~' t9 B" A( w% i - serveraddr.sin_port = htons(6000);//绑定端口6000, Q: K0 x1 L: D: Z$ C3 [
- int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));4 U2 d* p; Y& ~7 l& f; ~9 L
- char recvBuf[100];
' D8 J3 q: ]$ ?. j! d - int len = sizeof(SOCKADDR);
2 U+ v( @2 h/ t( k; j - listen(sockServer, 5);//5为等待连接数
2 [( w! v/ |# x2 D) A- r) R9 Q - while (1){
7 {2 a6 P# _0 L - sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);+ }& L. a0 c8 s3 [* i$ X8 h8 `
- //接收客户端数据. v) K9 s) i" q8 I' A) O4 E, S
- recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
4 I7 p1 A# K: l: n, g& j" a - printf("to me:%s\n",recvBuf);
5 a! A& j6 c; Q9 _ - memset(recvBuf, 0, 100);4 @3 Z' D8 a" I6 l7 K& Q
- }
1 c( E# `) u x B% P2 K3 q5 j# f - closesocket(sockClient);/ j c* ]3 @& o E
- system("pause");' Y! \1 J+ R- P Q2 w0 ?
- return 0;
5 ? u+ J6 [! X1 u& o - }
复制代码 客户端代码:
- W5 Z" r2 V0 H/ o, [- #include<winsock2.h>2 U" |5 I4 p& o
- #include<stdio.h>. C* Q1 K9 `5 S8 q4 I* y
- #pragma comment(lib, "ws2_32.lib")
' r; F& X" L2 K# o; a; @ - void main()
- x) z' ~0 J" K' `( Z0 d - {
, C9 M2 w: i# k1 v! ]- x - WSADATA wsaData;8 M$ L6 C+ [& U J
- SOCKET sockClient;//客户端Socket
) h6 z0 t/ H# t+ d - SOCKADDR_IN addrServer;//服务端地址
; a0 p1 i( i+ x' @3 e( Y - WSAStartup(MAKEWORD(2, 2), &wsaData);
0 y; D m- r! y! @" A/ s8 D - char message[20] = "HelloSocket!";4 T0 h1 l( j) i }+ c- ^
- //定义要连接的服务端地址8 C2 k+ M, V& i' H* Q
- addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
& }1 l' l; B* Y) O4 C - addrServer.sin_family = AF_INET;
: U. K, U, D! Y0 b7 S: e, I, n w - addrServer.sin_port = htons(6000);//连接端口6000- f& r- u. n" G7 h
- //新建客户端socket. c7 }5 K/ n" U; z' Y1 j
- sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);; b/ k0 f. J" _ c
- int s = 0;
7 n" {' I0 Q& K! S5 J( m8 [7 x - s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));. P) v$ u6 n0 Q8 i! G
- ! c; b9 F* e& G9 w4 g
- while (1){8 }+ ?& J: Q: K+ r) P% E: Q! _
- //发送数据
# }7 w' [5 x% |- G% M - int a = send(sockClient, message, strlen(message) + 1, 0);
, i$ n( h( X8 U& f: I1 w - printf("to server:");
8 D2 s0 R2 f( L R) ~8 {7 k - scanf("%s", message);( C8 b- z8 ^# o. J$ ~
- ; c+ Z4 T; r- L/ Y7 N
- }
" c7 g6 H7 u4 i% |. l& K: A6 z5 o - //关闭socket
m" B, b5 S: p% l9 H: q" e - closesocket(sockClient);
# W9 Q/ G+ W" n - WSACleanup();/ R6 K7 N7 K$ l3 @! e+ v
- }
复制代码 求懂的高手来解答一下。
! b; b0 a$ G8 w" a, K谢谢了!
9 H4 ]. r7 f1 r: s% C B* P. f4 p, \+ ~: ?; }: Z
; |- |, t5 E t# J/ Z* C9 g' g+ k0 R
% u7 _+ S& G, b& z0 x |
|