cncml手绘网
标题:
C语言 socket 编写简单服务端客户端通信问题
[打印本页]
作者:
admin
时间:
2020-5-9 02:32
标题:
C语言 socket 编写简单服务端客户端通信问题
大家好,感谢你的回复。
" M2 X* v) T. m. b2 p2 Y" m
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
# M+ |$ X' r4 K ^0 {6 n
Talk is cheak , show me the code.
$ }& g# o* A! H, _& x
服务端代码:
# P0 ?; @( I3 c* Q7 U
#include<stdlib.h>
" y# }3 p; F+ o8 m) ` P
#include<WinSock2.h>
% a9 J7 w6 l0 o: ?7 l9 _* w8 n
#pragma comment(lib,"ws2_32.lib")
/ {7 B# S) w- c0 v5 d+ ^$ S1 ~
int main(){
. p, ^2 v; f1 n) P: [* k
WSADATA wsd;
; k: ^# C5 K9 z8 y' t1 S
SOCKET sockServer;
8 {) l) a/ r, Q* q) {8 k
SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号
0 L/ W. m! Y8 u9 q/ R' t- w0 u
SOCKET sockClient;
; _3 M0 g2 A0 A. P4 z" Y' T
SOCKADDR_IN clientaddr;
; F w% \. B X* E T: {; V
WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
?& _; L, g T( L2 C
sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
8 A. U: @9 d( @% D) q
! j$ B+ y' X! @" P! I; `; I
6 ]8 |; l/ ^9 p' l9 K
if (sockServer != -1 && sockServer != INVALID_SOCKET){
: j' ~1 I X# z. f6 p* b
printf("Socket has been created :%d", sockServer);
1 ?2 ]. i$ b) m- H9 A0 I. B
}
7 y0 N3 g/ k$ M+ g( e! a
else{
y0 L1 `: V* i% @# S8 W
printf("Socket create failed.");
; ~5 f" W; M4 E5 T8 R8 P7 ?
exit(0);
$ P* D! h2 u' A a
}
! A8 D y0 m; f ?0 r- t7 o
serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
n1 c4 u. @+ Z% @
serveraddr.sin_family = AF_INET;
) `) c6 J" K2 w0 L
serveraddr.sin_port = htons(6000);//绑定端口6000
1 K2 J F2 O8 Q5 E# U! V
int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
0 x- o3 J4 p1 C
char recvBuf[100];
$ H% R+ g; i/ ~3 Q/ Z& ^& Q$ G
int len = sizeof(SOCKADDR);
/ |0 M! K7 `4 R' o- o% k/ w0 c8 Q, `2 E
listen(sockServer, 5);//5为等待连接数
5 }: X: s! a0 i h8 j7 Q& ^/ `
while (1){
! [. Q3 }7 Q8 e+ F4 n1 @5 ]2 h
sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
4 j7 I$ M ~& o3 c* g+ {6 T
//接收客户端数据
$ j# Z z/ _& ^" n, E- v
recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
* I0 p" n* n k! o! q/ I
printf("to me:%s\n",recvBuf);
/ x8 j2 f: r& b) P
memset(recvBuf, 0, 100);
) l0 W4 D$ ~+ w A1 b% t7 e
}
: |* y/ J" n! c* K) B
closesocket(sockClient);
5 M1 u+ Y# x5 m8 u) a
system("pause");
( B, ~8 k3 t# z) J5 n9 D _
return 0;
9 G8 A0 G# k% A# o, p8 l2 S, X
}
复制代码
客户端代码:
P- D3 o/ s8 T4 A" N+ I2 y
#include<winsock2.h>
1 B4 c# ]1 Y, @) J6 l& i
#include<stdio.h>
! U) G" i& v- e. N* G: u% V
#pragma comment(lib, "ws2_32.lib")
7 s0 _+ W0 m6 ^
void main()
# n2 R6 K! b* K c, D
{
$ g B& P: ?5 b# [: l
WSADATA wsaData;
% z6 P; q, J3 @3 s1 b" e1 d
SOCKET sockClient;//客户端Socket
, ?) F! S1 G0 t: ?" I) H; G5 t" a
SOCKADDR_IN addrServer;//服务端地址
7 U; j8 o: g5 M @
WSAStartup(MAKEWORD(2, 2), &wsaData);
9 E9 U0 e2 x( j: ~4 h# d+ s
char message[20] = "HelloSocket!";
2 }/ ?* `+ g, b& T
//定义要连接的服务端地址
7 O. Q' d4 |0 o: m) V
addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
0 J: B* _0 [! S
addrServer.sin_family = AF_INET;
; K: T& E* ^3 V
addrServer.sin_port = htons(6000);//连接端口6000
5 f* x6 c' J K5 ^$ j6 C) q6 B
//新建客户端socket
5 K3 f5 |6 d( W' R
sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
' ~0 N4 b( i; v# ^& z
int s = 0;
8 d$ V- k* g4 b# l8 b
s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
9 B B( F; `) A$ r
|# f9 M1 B3 Q, }- Q2 b8 E
while (1){
) D- E; C8 t1 S1 z) D/ t
//发送数据
$ v' P" m1 p2 z9 Z+ g3 h) A9 J# J7 l! k
int a = send(sockClient, message, strlen(message) + 1, 0);
5 q$ e# H3 c4 l9 Q. z+ b) X4 h
printf("to server:");
3 p$ \: Z- m! q7 v& K. `+ k
scanf("%s", message);
/ }7 w' U4 |8 j( |
' j( V1 I1 T$ W) ` r1 c4 M0 Z+ W- r0 p
}
) {6 E1 X4 H; d2 H. P A
//关闭socket
" d; t: n& C ~( c- j! M& Q
closesocket(sockClient);
7 H0 ^. y) ~5 ~6 _. e
WSACleanup();
% c5 m1 I1 r* l, n/ ]- Y
}
复制代码
求懂的高手来解答一下。
5 A& G& ]: l: d5 O
谢谢了!
3 n5 L/ t# _5 w% P
7 j8 n6 n/ D. G4 a% e
+ i; B' S% ~+ [9 D7 a0 r5 a5 i( E* z
0 v, h* U4 M( H9 e" O! x
作者:
admin
时间:
2020-5-9 02:33
应该用多线程或者多进程,,,过两天给你源代码
作者:
admin
时间:
2020-5-9 02:33
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
4 G* t) I0 F! ~3 h2 F! ]* s
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
欢迎光临 cncml手绘网 (http://bbs.cncml.com/)
Powered by Discuz! X3.2