cncml手绘网
标题:
C语言 socket 编写简单服务端客户端通信问题
[打印本页]
作者:
admin
时间:
2020-5-9 02:32
标题:
C语言 socket 编写简单服务端客户端通信问题
大家好,感谢你的回复。
3 e' R9 r4 C$ `
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
' m: w. O' [* x* }- I7 k5 b
Talk is cheak , show me the code.
5 y% p* c1 X/ M9 W
服务端代码:
. \9 `# F8 l8 ]; Z6 Q+ C& M6 H
#include<stdlib.h>
4 W% u2 m" j" P9 L
#include<WinSock2.h>
1 x+ V9 b( A: x9 n! r, F4 E! _
#pragma comment(lib,"ws2_32.lib")
2 @+ O4 [/ p; d% s6 A
int main(){
5 e! C+ L3 i- c' r. h: E; O
WSADATA wsd;
) Q( G: o# f# x4 O
SOCKET sockServer;
) k! A9 i, R# f6 p' o& u# ?1 Q2 n
SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号
: I+ Z3 k* ^) ^. w
SOCKET sockClient;
0 r- {4 @1 F% l2 T1 C
SOCKADDR_IN clientaddr;
" p! h4 t+ Q9 E1 e3 S& P5 e/ u; I
WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
6 ^" L. z: ~" v0 g' b) [! q% |
sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
" l% C; i9 W; B2 s( r T
1 q% F. ^. G; H1 N
5 g) a1 ]6 {+ }* O( \3 }) ?
if (sockServer != -1 && sockServer != INVALID_SOCKET){
$ p& g7 s/ f9 _7 h( F& i
printf("Socket has been created :%d", sockServer);
4 u( `6 i; |0 Z+ l; i) M! Z/ o2 O' t
}
2 m$ a5 o: w* \* C: C; j0 N
else{
8 \, v* ^6 J# f; b1 ^+ @1 V% E; Y
printf("Socket create failed.");
* W* n/ Z5 a: o( X% E
exit(0);
~: w( a. @5 Y" J e
}
8 M6 w. K+ l$ L$ ]
serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
7 C y1 c/ ~1 U. {; `" r6 W
serveraddr.sin_family = AF_INET;
1 F+ R9 _4 R/ Z+ [4 R8 V5 x3 l
serveraddr.sin_port = htons(6000);//绑定端口6000
3 E4 B% P2 E& ]. C% w
int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
4 P# j6 x- k1 [6 S' }. u
char recvBuf[100];
- Y1 U' o% d0 d4 u$ p1 B0 A8 z9 Q: h0 q
int len = sizeof(SOCKADDR);
?( S ^7 L7 K4 O6 [+ F; e
listen(sockServer, 5);//5为等待连接数
2 d9 n, u5 x" W
while (1){
9 c' E9 T4 G# Z6 s6 S
sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
6 [$ B& ^$ ^2 G! ~
//接收客户端数据
9 `/ K6 P9 L/ N8 K
recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
& v+ J' V/ @; ?7 t
printf("to me:%s\n",recvBuf);
- z- ~9 ?8 Y$ a" c: @
memset(recvBuf, 0, 100);
1 B: I' B. r4 i9 A7 N. X, }4 d7 J
}
# G% b& P+ w* S
closesocket(sockClient);
x) ]$ x+ Q9 n* d( i ~7 y0 r
system("pause");
; O f8 ^4 G0 c# P' c: |2 Q$ Q
return 0;
; [) }' W+ J# k/ z0 a) E
}
复制代码
客户端代码:
/ v" J* {4 J2 l2 W
#include<winsock2.h>
% Y" x w# m7 ?& r5 _5 `8 |. w0 m
#include<stdio.h>
- v6 F8 F0 U' ?, C( @4 v) G& h
#pragma comment(lib, "ws2_32.lib")
, m9 l- F3 s3 z7 M% f
void main()
5 R5 N" V9 w8 |' Z+ A S
{
3 _) o m I' v7 A2 _4 P
WSADATA wsaData;
! O M. H l; [! o5 ^+ k* O+ y
SOCKET sockClient;//客户端Socket
! A. W# s+ _+ z
SOCKADDR_IN addrServer;//服务端地址
+ \3 A/ N1 D0 G! P
WSAStartup(MAKEWORD(2, 2), &wsaData);
% H0 O# c% m3 i. | Z5 N
char message[20] = "HelloSocket!";
' M" z# {! p$ ?. D- ?# }, v
//定义要连接的服务端地址
. S% m6 }+ k* \0 O( f" q2 t z+ h$ n @! e
addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
1 T8 k! y7 n0 x: r; e9 ^+ q8 m
addrServer.sin_family = AF_INET;
c* `) B: s; i) S; d
addrServer.sin_port = htons(6000);//连接端口6000
& y) J8 F6 y3 `, S
//新建客户端socket
5 _4 ~& n2 M/ n, J3 r3 V0 l) _
sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
3 t, {1 z6 j+ x `/ c8 F# j7 ]. i- h
int s = 0;
, H5 l' ?/ O. \* L0 {2 f# V2 _
s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
2 S9 j2 X- S" S! ]5 z, ^
/ I# N) U* r( W* T; v: c
while (1){
: n+ n7 D, V3 I6 _/ E
//发送数据
8 J' O, f5 M, v
int a = send(sockClient, message, strlen(message) + 1, 0);
" ~' N1 m* }# E9 d4 v O. M
printf("to server:");
0 k; ?" N( l) }& c0 _, T+ g3 }- E
scanf("%s", message);
9 P3 n( x9 R& V2 O }+ r2 C
' C+ z9 y: b' }) P4 b% ^& `
}
: B/ y( f9 U1 X! h# T6 U
//关闭socket
1 d$ X# ]5 c2 G( n0 g4 W
closesocket(sockClient);
2 h+ c6 i' M h" u: Z0 w$ C
WSACleanup();
: V8 P1 c; \6 P9 ]; C
}
复制代码
求懂的高手来解答一下。
+ i2 U1 I1 \# k! c, c3 z
谢谢了!
. H3 ^ `' t: t; F+ K
5 `. ?" j* I( E1 c( A
3 L6 n" }8 G: D, d1 L$ \
% l- H/ T8 O8 t; j+ |
作者:
admin
时间:
2020-5-9 02:33
应该用多线程或者多进程,,,过两天给你源代码
作者:
admin
时间:
2020-5-9 02:33
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
# G" x, M& \5 t
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
欢迎光临 cncml手绘网 (http://www.cncml.com/)
Powered by Discuz! X3.2