管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
大家好,感谢你的回复。
9 z$ \8 w9 ]0 B1 e' `# d3 _0 v我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。- ?1 S2 J$ p6 |! k) ]
Talk is cheak , show me the code./ y1 M: D8 l% m1 K2 w8 C% ?
服务端代码:
, A) C& G/ Q! @9 {- #include<stdlib.h># G. e' \/ s7 Y7 D6 v5 J
- #include<WinSock2.h>. w( |4 J T6 n8 W
- #pragma comment(lib,"ws2_32.lib")
& q: e5 C0 U7 @- T* M) l - int main(){
! ]+ v) i, s- l9 j" ^" n - WSADATA wsd;' C9 `( b+ w0 p
- SOCKET sockServer;- i% C( Z( P/ N H/ t0 h
- SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号
# i) K" m, L! L# Y* \7 u4 Z - SOCKET sockClient;
* q( Z* m5 p( t1 I) f - SOCKADDR_IN clientaddr;: K0 Q1 {9 H4 \/ m: ]2 L
- WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
; u8 J$ G( d1 H& k" X - sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket. E4 U( V6 s7 M1 S0 u: Z
- ' M. j L$ K7 ]7 I; I
- # P5 E$ O4 t) {) p
- if (sockServer != -1 && sockServer != INVALID_SOCKET){
; O( @8 i. v2 p5 X7 G - printf("Socket has been created :%d", sockServer);
) h( e |) R9 ^) U9 m - }
7 f5 O- ]* f5 G$ k' o - else{& Q4 m' f5 T, P; G2 s: @; j! k K# s
- printf("Socket create failed.");* j% Q7 Z+ T/ a5 W' A( {
- exit(0);
% x! q: l7 Y( g3 A - }+ X# c# g m0 F4 [4 p& h/ T" j, T
- serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
: x, e5 s$ u N& r9 A* E - serveraddr.sin_family = AF_INET;0 W3 Y( X \& \" S6 J; F5 R4 Y. |
- serveraddr.sin_port = htons(6000);//绑定端口60004 I8 f. L) X/ V3 X
- int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));9 m- l# c a2 p$ u
- char recvBuf[100];
, S& Z6 b1 n& ?9 a+ N. H1 V - int len = sizeof(SOCKADDR);. ]; s9 I- f7 R8 y, x
- listen(sockServer, 5);//5为等待连接数
2 U) I/ o1 [) y" J - while (1){) [, S( _+ m: X7 {! o
- sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
) H; n+ N% L* p% F/ i0 C3 r2 w - //接收客户端数据
; d d# R K0 ]4 R% H; G - recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);8 N6 ?. ^$ s8 n$ Y2 T& D
- printf("to me:%s\n",recvBuf);
) z5 ?* U0 x& u d4 v9 h - memset(recvBuf, 0, 100);
0 Z+ Z: t( T7 h# _' A% S& F - }, @* t6 ]9 C; ?. J# m
- closesocket(sockClient);# }. o" f, \0 g& a
- system("pause");
m$ L* A' ~+ i- c" u) \7 V3 L$ X - return 0; B2 I1 d5 P1 L) C; {
- }
复制代码 客户端代码:
) `0 A, A# e B# t7 \& L" c1 U- #include<winsock2.h>
$ N; D4 H9 s; d7 x - #include<stdio.h>
7 m0 y2 ]# E) ` - #pragma comment(lib, "ws2_32.lib")* w' n" e2 t' ?: u& X2 `
- void main()$ p: g6 b# a, u* C' m/ ^# T% {$ i; O
- {
# P, i' g; U1 m2 Z - WSADATA wsaData;
! [+ k u% v! s7 [* N9 Y- O) A, ] - SOCKET sockClient;//客户端Socket
" `# D5 F3 F3 z% a: {8 E* u - SOCKADDR_IN addrServer;//服务端地址: T; k" x# R u2 u( ^
- WSAStartup(MAKEWORD(2, 2), &wsaData);8 H; z& U6 B& f4 X9 R2 H
- char message[20] = "HelloSocket!";( p% E, l7 r+ u$ P* B
- //定义要连接的服务端地址
7 {: Y U) L1 z - addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
% C# D2 E' D7 T - addrServer.sin_family = AF_INET;
6 f0 d; a2 L6 Z, I. } - addrServer.sin_port = htons(6000);//连接端口6000
/ z$ Z) i# m, `% g# I - //新建客户端socket" o8 N8 u4 q( C- w
- sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
9 n" G# ]6 [# ] - int s = 0;) r% i. R# |9 t, K: x, ^2 M
- s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
( G. q' q: V. Z: v* ]4 t( g
; P1 @ X% x! A$ p4 S$ G, ]+ L- while (1){" t3 A7 ^6 q- G' A5 ~6 g
- //发送数据
( ^& j# h* S( f: U) T - int a = send(sockClient, message, strlen(message) + 1, 0);
; m8 q) @% {. ~ S* p, Z - printf("to server:");
# e1 }& R$ v' F - scanf("%s", message);
L! {9 r+ T- B' l8 J- V
; |% K/ U d4 c8 Q5 Y1 X# M- }
# R5 N' _% J" w8 C. W9 B4 G' y - //关闭socket4 Y0 n, o4 ?9 m
- closesocket(sockClient);: m2 S; J4 G4 Z
- WSACleanup();
. N% w( ?( v: H) k) N, b4 S7 m9 a8 P - }
复制代码 求懂的高手来解答一下。
: B6 C0 ]( a; y9 Y) [% C7 Z0 t8 n/ R谢谢了!7 V5 ?1 I8 d8 h3 {1 P) O
9 b2 G8 N5 v& w
3 s0 J( ?8 A K$ \4 ?( T# ^/ ^/ d# _5 P
|
|