cncml手绘网
标题:
C语言 socket 编写简单服务端客户端通信问题
[打印本页]
作者:
admin
时间:
2020-5-9 02:32
标题:
C语言 socket 编写简单服务端客户端通信问题
大家好,感谢你的回复。
7 J5 l) H" k( h, }0 c A
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
$ z% x- S& Z/ }. U
Talk is cheak , show me the code.
* }$ Q2 R- v/ }! t- }$ H$ H5 H0 @% l; W
服务端代码:
2 O9 R( R$ T. j" k1 U$ m
#include<stdlib.h>
! _3 [/ R* a h: C
#include<WinSock2.h>
& s4 ~# i. @4 w
#pragma comment(lib,"ws2_32.lib")
. j/ N m( M% U8 M3 }6 ]
int main(){
: } t- V2 d' s" J8 C& P% i
WSADATA wsd;
. u( E6 @' y+ H$ M/ N- F' P
SOCKET sockServer;
$ |. r" l! a. {( u. F1 J+ Y
SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号
- v+ h) x* J. N7 j% j: c. d, c; s
SOCKET sockClient;
/ `3 N' a1 ^2 Y5 @( }
SOCKADDR_IN clientaddr;
8 l" a" ?- E4 m+ S' d
WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
) D" W ` N. V! H
sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
# ~. f. W/ Z# x
9 K5 v1 l( B! e$ W
1 f8 Z C- @9 Y
if (sockServer != -1 && sockServer != INVALID_SOCKET){
4 v; `) ^0 V, X' ] o% w
printf("Socket has been created :%d", sockServer);
; h @0 @2 K/ x9 \ c
}
' w+ {- |5 T2 O3 ]8 }
else{
% T+ \1 o/ t& S0 |3 m+ h9 A" z5 D$ V
printf("Socket create failed.");
3 d7 z! Z2 [2 Y# [, Q4 N* `
exit(0);
" i- s- _4 b+ D* M
}
& _3 `$ R2 H$ j! o$ h( P% l+ B: M
serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
5 e$ O5 x+ y" ^1 F
serveraddr.sin_family = AF_INET;
6 |9 T- v' j: ?' ~! [
serveraddr.sin_port = htons(6000);//绑定端口6000
6 j# \ y. `6 u& J' j% t+ \' w
int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
) v$ E" P8 ]: X: r
char recvBuf[100];
$ U0 g& p; ]' g
int len = sizeof(SOCKADDR);
4 z" U \; V4 m% i `. @
listen(sockServer, 5);//5为等待连接数
' C% U3 m7 [% ]. n1 j. m6 w
while (1){
) ]! A4 X" z! U
sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
9 }& |5 N5 i- C! ^' S0 _
//接收客户端数据
8 i, O3 V9 {) S. I2 d
recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
5 S: G1 |3 ^# l# `! t+ _% H$ ~* T6 g1 U- B
printf("to me:%s\n",recvBuf);
' Q9 T6 H9 m2 D3 y
memset(recvBuf, 0, 100);
6 v. ~% h# a0 G: [4 @
}
1 n9 f/ D! {6 c+ l! T# K
closesocket(sockClient);
6 h6 D1 b, m" a/ M$ A& {
system("pause");
6 n. z- U# {- `# i, s" z
return 0;
4 D1 a0 m) W, d0 D, A
}
复制代码
客户端代码:
" U6 ^. K" K0 R$ N/ E4 a9 q. b
#include<winsock2.h>
7 m1 ~( ]1 H, N+ ~. r3 d
#include<stdio.h>
! W3 \( e" b9 y) \( ^6 I: X
#pragma comment(lib, "ws2_32.lib")
: {: H3 e' P8 W
void main()
0 G \9 H9 t+ a# _% P
{
4 P1 r" a; f2 g8 V2 U
WSADATA wsaData;
; j% X/ u$ a j( g# d
SOCKET sockClient;//客户端Socket
: v$ \' |) B! C' z7 V* R4 g {
SOCKADDR_IN addrServer;//服务端地址
3 h0 X# u6 L6 W# ]- j- ?
WSAStartup(MAKEWORD(2, 2), &wsaData);
) I9 v2 a& Q: _6 E# c/ J
char message[20] = "HelloSocket!";
6 l. `* v$ @) K9 V0 g* G
//定义要连接的服务端地址
" c! c* A: H, Z' V0 D5 X
addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
; {3 m8 _1 t: s( e5 n- f# C
addrServer.sin_family = AF_INET;
. I9 O6 O% K$ Z! b
addrServer.sin_port = htons(6000);//连接端口6000
. w% B8 ^3 A, w4 F( b* q
//新建客户端socket
& Y* S2 O; b9 ~! ]6 A3 S4 D
sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
4 p5 a: u P) D0 }/ {# B
int s = 0;
9 \/ b/ a* S. _
s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
) ^ k$ G3 E: c6 S/ q+ C( ~
% H! p* ^& B# \5 N# U
while (1){
( Y7 q |6 t7 z2 I+ ~5 _
//发送数据
v" E% H8 G9 K y3 k/ l- Y
int a = send(sockClient, message, strlen(message) + 1, 0);
" a7 J1 ~7 c& N3 Y# m& D! A
printf("to server:");
# u# e" Z8 B) w
scanf("%s", message);
, B' `( _8 G7 n( q
, _; c# v. d5 f( c- X
}
3 n9 d) ?8 l& O
//关闭socket
' k; ?* r6 U: N
closesocket(sockClient);
& t7 O: ?* P2 U. y0 z: {. |6 g; m
WSACleanup();
% g6 l. r, ?% }
}
复制代码
求懂的高手来解答一下。
: }% n1 K y1 D+ h# a5 h& c" v
谢谢了!
6 A, z) ~7 s0 N! X: g+ \
( W$ J0 x3 V7 N; L! ~3 I0 V+ b
% e6 m% a! U0 ~$ [ c; v
6 f6 s; w1 U* S* K5 i( M4 A! w% e
作者:
admin
时间:
2020-5-9 02:33
应该用多线程或者多进程,,,过两天给你源代码
作者:
admin
时间:
2020-5-9 02:33
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
. r: W2 I6 f5 @) V6 Q
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
欢迎光临 cncml手绘网 (http://www.cncml.com/)
Powered by Discuz! X3.2