cncml手绘网
标题:
C语言 socket 编写简单服务端客户端通信问题
[打印本页]
作者:
admin
时间:
2020-5-9 02:32
标题:
C语言 socket 编写简单服务端客户端通信问题
大家好,感谢你的回复。
& u# n8 g3 K1 Q# t: l
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
' [: |' X, F6 g: ]& K4 A% `
Talk is cheak , show me the code.
- f4 g% @7 z% Y; O" e, A
服务端代码:
- u' r( q( T% h B! _# w( y/ Y
#include<stdlib.h>
9 C. C* ?) _0 r( |" F F$ H
#include<WinSock2.h>
M1 J2 Y& P# [
#pragma comment(lib,"ws2_32.lib")
! X: w" @1 C7 g# Q
int main(){
; E( M+ d6 a2 j. G4 l: ]( O# G1 X
WSADATA wsd;
+ n7 N6 y% D/ B1 `
SOCKET sockServer;
% D, B/ X8 S% k4 \
SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号
3 u& d3 H# _& x7 Q1 [
SOCKET sockClient;
5 y" x% G1 q/ m( V* \
SOCKADDR_IN clientaddr;
- I% ^6 |( w: q& j# ^7 W
WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
. j6 Q. ?6 d8 K; G8 P, p
sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
4 p9 U/ v. }! w3 L% m- n% g
; F8 P* x# R7 }! w3 _5 L3 l
/ }5 e% k# ?: S2 u+ O/ B
if (sockServer != -1 && sockServer != INVALID_SOCKET){
; Y. x" q+ w9 E
printf("Socket has been created :%d", sockServer);
0 K4 ? z6 ]0 R! d, Z8 ]7 J* x' p
}
' C$ f+ i5 w) J* ?0 j( k+ b' q$ \
else{
L1 u1 x/ [7 f8 ` m, G
printf("Socket create failed.");
% m' o+ b4 \+ Z2 o
exit(0);
% H Q4 d) Z, L7 X' j1 s
}
* G0 C" o0 S2 P. F
serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
2 N8 _. Y1 L" [! s2 @; {
serveraddr.sin_family = AF_INET;
3 Q7 P3 e- I; r2 x, ~' W4 p
serveraddr.sin_port = htons(6000);//绑定端口6000
8 ]4 ]" Z- @+ u
int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
4 j# i6 {# G% j! Z9 `
char recvBuf[100];
9 f3 }+ u4 `% Q( Z6 q
int len = sizeof(SOCKADDR);
& X1 B, b1 U+ t, g
listen(sockServer, 5);//5为等待连接数
6 o v' w8 W# D+ @
while (1){
2 R" u" ^. [8 m' u) L* T
sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
* i' Q0 N% I8 M! `1 I' H: n
//接收客户端数据
" j7 B- d M& n( O5 }* s1 D% p/ j: [
recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
- Z- ~1 v( N( J |! k/ S
printf("to me:%s\n",recvBuf);
& m0 \! T- r; d; {0 P
memset(recvBuf, 0, 100);
" H) _' `9 f) Z3 D! k! T
}
! [, u7 U; s1 I2 [/ C, n f& y
closesocket(sockClient);
P& W- W' L5 t) ?0 K
system("pause");
' v) [+ j- d# C6 N& n5 w
return 0;
+ |% O) ~! a6 J. a! |
}
复制代码
客户端代码:
* u! j. ]( g! [: k0 d6 g- E
#include<winsock2.h>
% O; p R+ m3 S5 ~3 L! p" c$ [, F
#include<stdio.h>
: r4 [! c2 {; K; u* B
#pragma comment(lib, "ws2_32.lib")
" U$ g# O4 v" I1 I& X: N
void main()
0 b9 J4 _6 _1 v" s4 U2 A% r
{
1 w5 |' ]5 c5 @& M$ Z
WSADATA wsaData;
( F( j4 f% H) b% L9 R* e. v3 e) j
SOCKET sockClient;//客户端Socket
4 S _: \& u1 L) t
SOCKADDR_IN addrServer;//服务端地址
+ @0 E) o* ^1 O: p+ Q* K
WSAStartup(MAKEWORD(2, 2), &wsaData);
, v4 K2 u' c1 i7 P" k0 X0 R! @- M
char message[20] = "HelloSocket!";
6 _8 Q! _* D5 m6 P
//定义要连接的服务端地址
) p; |0 o- ~- x0 r6 U4 l5 v0 r
addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
/ I; j5 b& W7 t7 a( g1 z9 |* s
addrServer.sin_family = AF_INET;
* ~# c1 N' I7 J; B) o5 V
addrServer.sin_port = htons(6000);//连接端口6000
6 O& V, z+ _0 e6 S9 R+ }
//新建客户端socket
) b1 G- U5 G# Q# p
sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
1 D! [% _- P. x( ?5 j
int s = 0;
- U9 ^, f+ D: v+ D* j7 M! T/ F, `3 I5 s
s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
5 I+ ^. G0 H: C7 _6 S
% w# I; n2 M1 S/ d. ~" t
while (1){
' F2 a% i1 R2 w! x
//发送数据
7 O# L; K( N- q
int a = send(sockClient, message, strlen(message) + 1, 0);
7 C9 w3 i+ C5 D7 f+ {( }
printf("to server:");
- N8 ^8 j9 V; {. G' F; Q8 J
scanf("%s", message);
: w. S7 Y- W& a/ B$ w. o- c8 F
7 Q4 a' b1 Z1 R& ~% f
}
% c+ a. j1 e/ e1 ~& o0 f
//关闭socket
- E; c5 x( j3 L9 y" a' X
closesocket(sockClient);
) S" Y+ S7 I7 E3 B: K( {( t- _
WSACleanup();
. y* g3 }+ i% I6 y3 W
}
复制代码
求懂的高手来解答一下。
( e0 v/ J4 F- A
谢谢了!
, Z- ]! e5 X3 |! y) A4 d
/ }( a6 D8 E$ @
C. K3 a/ {, L$ U8 h* }
+ A3 h: i3 z& Z+ D. O$ z, ]+ \3 Z1 m
作者:
admin
时间:
2020-5-9 02:33
应该用多线程或者多进程,,,过两天给你源代码
作者:
admin
时间:
2020-5-9 02:33
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
# H, S6 i/ F7 ]9 p: `- O& X2 {7 g6 S
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
欢迎光临 cncml手绘网 (http://www.cncml.com/)
Powered by Discuz! X3.2