cncml手绘网
标题:
C语言 socket 编写简单服务端客户端通信问题
[打印本页]
作者:
admin
时间:
2020-5-9 02:32
标题:
C语言 socket 编写简单服务端客户端通信问题
大家好,感谢你的回复。
& @3 X/ O( |2 f& I0 }+ W
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
z. O) t: c% t& a* C6 @
Talk is cheak , show me the code.
: D+ H+ w* ^& w7 @& X
服务端代码:
2 r; R3 x- U% F
#include<stdlib.h>
5 X& U- W9 H9 ]$ P6 s
#include<WinSock2.h>
$ n+ [' O& G" e$ e# _% n, n! [
#pragma comment(lib,"ws2_32.lib")
8 z% m# m) i& s) `
int main(){
$ {1 x; X& G4 A4 B" W7 _
WSADATA wsd;
7 L# K( S3 k/ G0 d$ \& o
SOCKET sockServer;
! I. S) P" `. d9 J
SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号
8 s7 q5 d) j8 o; q' r4 T1 \
SOCKET sockClient;
3 H4 I0 Q/ @) r- c0 Y
SOCKADDR_IN clientaddr;
& M8 }1 C8 A3 C1 A$ {8 h l$ w
WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
( H) V2 O# f, T- ~- Z1 \5 h
sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
0 ^$ d/ G$ R# o$ ^ j
, Y9 F- w, r1 M
" Q; S2 Q! a: _$ q5 u8 r1 I
if (sockServer != -1 && sockServer != INVALID_SOCKET){
' c/ n4 W2 C) L3 ~8 `. l
printf("Socket has been created :%d", sockServer);
4 c' g! c1 Y! a2 b) |
}
0 {, o: C9 g7 A
else{
5 D1 Q3 K5 m. t+ U
printf("Socket create failed.");
9 r6 E5 _( B! A4 {# ]$ B
exit(0);
+ s6 o' A1 y6 P- [; K
}
" d C1 H* t2 Q
serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
# @3 I$ G( ^) k3 B0 e0 i5 p
serveraddr.sin_family = AF_INET;
( C$ j. b& E" \4 g; ~
serveraddr.sin_port = htons(6000);//绑定端口6000
& k/ z* H, M7 w4 F& I5 y$ Z
int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
9 Y s% w4 w4 H A) ~( q- n
char recvBuf[100];
6 U7 U8 O& T: s5 u! O3 R% R: r
int len = sizeof(SOCKADDR);
6 l& g4 T/ _) I) O7 o- f$ X8 k
listen(sockServer, 5);//5为等待连接数
. H2 i" i# w1 q( l) j4 ?
while (1){
; g3 n! s' i* D
sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
, k& ^3 v. q0 B& d
//接收客户端数据
$ n3 }) N& V# N+ g3 y
recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
! ]: S2 c5 w$ X& w; l" O# M8 n+ c
printf("to me:%s\n",recvBuf);
, l4 Z7 q; j$ @# n
memset(recvBuf, 0, 100);
/ e# I9 }, z( h1 {! q a
}
1 O8 A1 ?1 C1 P4 b
closesocket(sockClient);
k. A* Y( E" n0 X+ b# C% i
system("pause");
1 n! _5 t8 y! K" h3 h
return 0;
7 T# h @8 N. y% }+ \8 z3 j
}
复制代码
客户端代码:
* O2 ]" c% A8 f% `
#include<winsock2.h>
) T+ L$ h% t) L6 G; t: A
#include<stdio.h>
9 b6 P. g. `$ ?; C$ k9 s3 h: o
#pragma comment(lib, "ws2_32.lib")
) w' a, b& Q5 c' a; ?, [5 t
void main()
7 P# c( ~8 A5 u, W" t2 {) G% |- p9 m- W0 t
{
% j3 ~& {- H, D5 c6 L
WSADATA wsaData;
: p9 l3 ~. d3 P
SOCKET sockClient;//客户端Socket
`3 t0 m0 v2 v0 U ^3 S& o; A
SOCKADDR_IN addrServer;//服务端地址
* d4 O }4 M( b" H) {- Z
WSAStartup(MAKEWORD(2, 2), &wsaData);
+ k- |$ G7 D2 l& t2 G. F, G' X
char message[20] = "HelloSocket!";
3 n- U& ^( _/ ~2 w O( a N/ G$ r p4 h
//定义要连接的服务端地址
- b6 V$ T9 G5 H% Y5 c1 o
addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
3 d7 J% t# ~2 V5 |7 `# }; w( D
addrServer.sin_family = AF_INET;
( k0 x S; j+ W' u ?
addrServer.sin_port = htons(6000);//连接端口6000
4 y8 S0 v; ?; v; m" k" ]: c
//新建客户端socket
7 Z- L# x6 i% B/ I8 o v5 f
sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
. K& o( z7 W, h
int s = 0;
( `& K/ U+ r$ B; a
s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
7 k. @, x2 M' L4 N# V
3 J5 Y* o6 o, e9 f
while (1){
4 `5 @% k2 D( C" p; e6 ]+ F
//发送数据
; \/ d! O7 M3 z0 J+ q
int a = send(sockClient, message, strlen(message) + 1, 0);
! o, V6 K1 D m
printf("to server:");
. e) H$ \: `9 O7 N( w/ @
scanf("%s", message);
8 P. I ]# @( t; K6 z) o! V
: m {! _% [4 C' ?
}
+ o* N. O& a; z( v' y, J# P9 M
//关闭socket
, u1 b/ k/ T% B6 [, M
closesocket(sockClient);
( q* A3 N8 M6 s# K
WSACleanup();
# F1 V, ]/ ?! A, v5 U
}
复制代码
求懂的高手来解答一下。
: h% x. z) M7 q- y% @; I& p
谢谢了!
9 Z" q6 f7 `+ A8 h2 x+ [$ U
' z9 j. t; N7 M& K+ `- [( q
- [7 o7 N0 c- d. e% D0 Y& z; L, l
% c+ ?# u. L' O$ T# x5 {) R* m
作者:
admin
时间:
2020-5-9 02:33
应该用多线程或者多进程,,,过两天给你源代码
作者:
admin
时间:
2020-5-9 02:33
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
, A/ B2 Z! X5 P2 j+ C# x0 i
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
欢迎光临 cncml手绘网 (http://bbs.cncml.com/)
Powered by Discuz! X3.2