cncml手绘网
标题:
C语言 socket 编写简单服务端客户端通信问题
[打印本页]
作者:
admin
时间:
2020-5-9 02:32
标题:
C语言 socket 编写简单服务端客户端通信问题
大家好,感谢你的回复。
3 ]4 R# T1 [+ Q. @
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
! }, D/ ? ]% `; E( T6 P
Talk is cheak , show me the code.
' m' b3 w) c" G$ {0 p& Q' O6 H7 {
服务端代码:
( M7 d+ M7 v. Z$ }; @
#include<stdlib.h>
, {( A: I x5 n
#include<WinSock2.h>
) w( }% t. f2 J n' D5 y, K4 j" ?
#pragma comment(lib,"ws2_32.lib")
6 _5 T8 @) L8 ?3 _
int main(){
6 x& j) _7 K9 c4 B- w( v/ s# `# g% b
WSADATA wsd;
+ V; C% X% n( Y* A! a7 k
SOCKET sockServer;
4 D) N( P+ q# e. r* }
SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号
/ u) D9 _2 }4 k! [9 \/ X3 ~5 h
SOCKET sockClient;
2 @0 m8 g4 y. K* c2 V4 R
SOCKADDR_IN clientaddr;
: E1 R- V/ s' v" C/ ?( E
WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
K D2 g. X8 r5 O! o6 X
sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
* e6 D' Z+ t, i M9 @' W
: r! s2 U1 E# N
( ^6 V, R, A9 F4 G# l
if (sockServer != -1 && sockServer != INVALID_SOCKET){
; e7 f" `1 L0 j9 b' s, d0 {
printf("Socket has been created :%d", sockServer);
( Q! \ k ]: O% `
}
( c8 D4 V6 t3 @& A' e3 h9 [7 Y
else{
" L e) t, o% n5 `; C
printf("Socket create failed.");
7 u0 P, H- N4 H' G1 t
exit(0);
7 \' |, A) e0 m' J( w( [
}
8 K6 a, F7 L3 H$ z) O t
serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
, @2 W' n; O9 \$ X( {9 r6 |. I
serveraddr.sin_family = AF_INET;
' A3 X0 N' z5 j) Z8 T
serveraddr.sin_port = htons(6000);//绑定端口6000
- X, Q& t# X( H- |- h
int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
3 N1 W6 g: ~' {( ]9 \, w" x* ^/ j& x
char recvBuf[100];
0 V% i8 ?* A" K9 u# Z7 ^; z, }
int len = sizeof(SOCKADDR);
/ w% J+ G4 \, Z5 ]: J1 j
listen(sockServer, 5);//5为等待连接数
! c0 D0 C, h! D: R3 q- E5 _, c( ^
while (1){
* N' \/ x9 @2 ?' w/ e. y
sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
4 Q+ ~- `4 g4 `$ h4 x
//接收客户端数据
4 Z* d0 i6 F) T. K
recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
! h) w7 e+ m$ Z
printf("to me:%s\n",recvBuf);
W2 L, Q4 o7 H# E: d; o
memset(recvBuf, 0, 100);
5 W% M& \/ p ~. x' b; i
}
, ? }! Q4 m$ z
closesocket(sockClient);
7 o: f7 y* y0 b: B
system("pause");
; C# G6 z; X9 I" Q6 ]3 B
return 0;
8 ~; ^% U/ \5 l A7 E
}
复制代码
客户端代码:
$ t0 t1 q; c% e4 l+ s
#include<winsock2.h>
0 e% | K# ]3 m5 w! P4 `) P
#include<stdio.h>
9 D$ i9 V' q' k3 F- L |
#pragma comment(lib, "ws2_32.lib")
9 F( c: L/ c |. z8 K0 z# y0 B# Z+ q z
void main()
& |1 y4 x8 B2 ^: ]4 I' [+ J
{
* {4 \& O; O6 o. d! Z% R
WSADATA wsaData;
- H+ n0 F) @: }% g; F6 n2 T2 F
SOCKET sockClient;//客户端Socket
3 p. G$ B6 ~! d
SOCKADDR_IN addrServer;//服务端地址
8 ~; g/ q: w$ q; O+ ^% c
WSAStartup(MAKEWORD(2, 2), &wsaData);
1 n) M' C8 E x6 r9 P' ?# [
char message[20] = "HelloSocket!";
% O6 }$ a; s# z
//定义要连接的服务端地址
# a! m* S- }2 a
addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
( C m, r3 N" H* _ L+ |2 K y
addrServer.sin_family = AF_INET;
, S/ l$ A7 I3 X/ h
addrServer.sin_port = htons(6000);//连接端口6000
7 D7 s( \9 k. H' F
//新建客户端socket
c/ Y$ m: z' f
sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
. ^" @3 b8 |+ J+ W
int s = 0;
+ E. |" u# q2 Y/ v+ e
s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
4 \6 o/ T$ t" |/ o% {& M
7 Y* ^; S8 ?. m
while (1){
% @! u. N/ C4 k
//发送数据
4 ?2 B1 o2 D8 y7 L6 W& e0 j% e
int a = send(sockClient, message, strlen(message) + 1, 0);
! }. S" [) r" x' v2 q$ T
printf("to server:");
' T% p1 Z' h( `) L
scanf("%s", message);
* D- w" [; m3 F. {, Q5 c8 t
) ~9 j' t3 t, N0 H! l ]
}
{, C* j5 u- t
//关闭socket
+ ^" c) q7 p* ~0 A K \2 ]- v
closesocket(sockClient);
) v" z0 `4 \8 R7 [) j$ G" C6 e
WSACleanup();
& L1 Y. \ }; @8 e$ Q, Y9 ^
}
复制代码
求懂的高手来解答一下。
# D% f& j( i0 }+ X
谢谢了!
8 S5 p9 B) T7 q2 I' C/ e0 b
4 U4 K7 E& n2 P8 c0 _! o, I
' n6 o, I T" s. J; b, r+ |" q
% V# l) b' n" Z
作者:
admin
时间:
2020-5-9 02:33
应该用多线程或者多进程,,,过两天给你源代码
作者:
admin
时间:
2020-5-9 02:33
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
% L. g! E/ x+ G; n3 V# s
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
欢迎光临 cncml手绘网 (http://bbs.cncml.com/)
Powered by Discuz! X3.2