您尚未登录,请登录后浏览更多内容! 登录 | 立即注册

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 10507|回复: 2
打印 上一主题 下一主题

[C] C语言 socket 编写简单服务端客户端通信问题

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。% Q: N; z8 M& P4 J2 d2 s
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
, s3 g( G: I! {Talk is cheak , show me the code.' q1 w6 T! h  U
服务端代码:4 t8 D/ G+ U. [1 D. x! X' ?; D
  1. #include<stdlib.h>4 ]& v! I3 Y% T' u
  2. #include<WinSock2.h>0 t) C- d! w2 m, k1 x6 J
  3. #pragma comment(lib,"ws2_32.lib")% c! u  t' Q! }# g2 I
  4. int main(){' q& Z8 d. D" y" ~3 ?, Q7 h4 @( b
  5.     WSADATA wsd;! v" r  {; H9 l( d4 t1 G+ a
  6.     SOCKET sockServer;1 @/ G9 j9 T( f$ [
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号5 `* i3 }0 k9 j5 o8 l7 `7 g
  8.     SOCKET sockClient;
    7 J" K) r. q& z0 h! `& W5 U  X
  9.     SOCKADDR_IN clientaddr;0 V  e3 A  a, I% Q* P, L0 c
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口/ T. i6 `) [" n/ f- n0 o
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
    & ?' b2 B0 U" B( y/ m

  12. , D- A/ x/ t: {8 t1 g7 |: A$ a

  13. 9 w6 `4 o1 ?, B  g5 S, h
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){" e- B) g+ m) K2 I; J& e7 T
  15.         printf("Socket has been created :%d", sockServer);- u; b% F5 O6 P- v: N' X/ N
  16.     }3 a6 v" I" E. m! u  n
  17.     else{
    ' L& }( V% N* q8 Z
  18.         printf("Socket create failed.");
    . ^0 N+ G4 ~, V8 p) R; i  ~, b; G
  19.         exit(0);
    : F7 |- Q. D/ T1 Y* t  m3 d# S5 _
  20.     }
    6 h6 H3 s5 T3 N) D  `
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    3 S: t1 B, l" B" x  R3 v2 j# ]
  22.     serveraddr.sin_family = AF_INET;3 D( Y0 T! n- @
  23.     serveraddr.sin_port = htons(6000);//绑定端口60006 i2 l0 E  k$ p+ g# I
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
    ) I# `/ T  v) u
  25.     char recvBuf[100];
    + t+ o! T5 v: p3 j8 ?+ [
  26.     int len = sizeof(SOCKADDR);  c) P& b9 a4 ]0 Z) g3 ^
  27.     listen(sockServer, 5);//5为等待连接数, e: X2 a# x; `
  28.     while (1){
    ) L( _1 D+ {& R  w
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    1 V( ~) m0 ?# D4 y+ p
  30.         //接收客户端数据
      I8 x# J8 i( s/ |* a0 I4 P# ~0 ]1 z
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
    6 y; @; f) X& g% S; D
  32.         printf("to me:%s\n",recvBuf);
    ' r- s- t( I: e# c: Y, C
  33.         memset(recvBuf, 0, 100);( m; J% U$ |9 p9 r
  34.     }$ Z; k7 l2 B1 h5 B0 ?$ }
  35.     closesocket(sockClient);
    ( r2 L7 J2 N( Q( [( ~
  36.     system("pause");4 A, r8 g8 K5 {/ Z6 D( G
  37.     return 0;
    4 o  ?  v4 w- n3 j9 t& ~+ S
  38. }
复制代码
客户端代码:
0 N6 a, H* W4 k: I
  1. #include<winsock2.h>
      @. u6 j7 E" q$ f; u
  2. #include<stdio.h>& g7 w7 \9 W/ I* D- N8 i
  3. #pragma comment(lib, "ws2_32.lib")4 Z  x1 U) J6 S
  4. void main()2 _' X& Y3 ?/ j, P& y+ ]
  5. {$ Z4 {5 O& h$ f6 U
  6.     WSADATA wsaData;- R$ O' u2 f5 a0 T- z
  7.     SOCKET sockClient;//客户端Socket+ y1 S$ R6 [3 M9 p! S
  8.     SOCKADDR_IN addrServer;//服务端地址
    , {- T9 J  Y% r
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);( A- ?" l4 ~! O% m# v
  10.     char message[20] = "HelloSocket!";
    2 O% d3 t5 i# M2 T$ P. E5 P
  11.     //定义要连接的服务端地址, w- `' L/ ^  O# e: Q5 k
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    $ H: d7 n+ ?& r$ @
  13.     addrServer.sin_family = AF_INET;
    : j! o. V- p, C# b/ z
  14.     addrServer.sin_port = htons(6000);//连接端口6000$ Z3 V/ E: s/ k- T% o
  15.     //新建客户端socket
    2 p0 g% c& O. D
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    " {8 d/ R8 s) c6 `' ~: @5 S8 `% B% I. d/ T
  17.     int s = 0;
    ) s  v* b' t6 @/ F' E2 d/ K. R
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));6 e. I, W" D! e; H6 h
  19. ; W3 ]8 g" ~* D! S# A9 N1 I
  20.     while (1){0 S" Y- F( \. F1 z; Q: j
  21.         //发送数据6 }+ b% P9 R& N
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);# H# X, }$ s+ S& `; ]3 {6 }0 `  w* E
  23.         printf("to server:");7 F5 @/ ?" q$ j4 B* v$ }
  24.         scanf("%s", message);& w8 I' z0 ^  Q7 x0 f; X' L9 k
  25. . c3 `5 t( F# ]$ v2 q, E
  26.     }
    0 \, {4 f# q: U9 t2 {  j! ^. A
  27.     //关闭socket
    4 o/ C: y2 T: \& Q+ l2 L+ U8 w9 w
  28.     closesocket(sockClient);
    # K( T& ?  i3 ]/ y2 S* q
  29.     WSACleanup();# u- i8 M7 ]4 V
  30. }
复制代码
求懂的高手来解答一下。
6 V4 C4 l3 _( j- ?# r, G% D- `谢谢了!
8 {1 g* A6 n* p( J, Q4 w

7 _+ w% D  ?; h$ o! c
9 s, M1 ]0 ^" L# m+ `
/ C0 X( u+ D; U8 O! w
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
沙发
 楼主| 发表于 2020-5-9 02:33:06 | 显示全部楼层
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 2020-5-9 02:33:20 | 显示全部楼层
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为) F  U! g& K9 b( ^' O  b( P
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-18 23:08 , Processed in 0.113781 second(s), 18 queries .

Copyright © 2001-2024 Powered by cncml! X3.2. Theme By cncml!