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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。
) {% B, f3 P, ~, w我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
( V" ?5 d+ j" g9 R( ]7 Z3 N' LTalk is cheak , show me the code.
2 Z* W$ }# }+ R/ X$ \, |7 k) P服务端代码:
* e: H0 D$ P) x  T2 c2 K  n4 D
  1. #include<stdlib.h>+ ?0 l7 ~, m2 M/ p
  2. #include<WinSock2.h>  |2 a8 c' @  |2 d
  3. #pragma comment(lib,"ws2_32.lib")
    ( K3 y2 c8 q. N
  4. int main(){
    1 W3 k+ H. r- W6 X5 i/ P/ R
  5.     WSADATA wsd;
    " ]- ]" s! x' C  C5 Y- u) f
  6.     SOCKET sockServer;: x8 E- e' V# N, [* X) N
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号  f! \1 l. Z# f& R. w( {
  8.     SOCKET sockClient;
    - A# L; N5 U6 S& |4 s" G8 g8 k
  9.     SOCKADDR_IN clientaddr;
    . W) t: i% p5 ?' Q
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口1 i) B  |/ c+ C8 @
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket: E  i, l) g" V9 J" T" |% e+ s7 y' Z
  12. $ ?7 ~/ R* g# T! \5 t1 i5 Q

  13. 1 r! Y) h6 L6 G6 j/ w# x1 f
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){! Y( f+ M+ e& j! w. L
  15.         printf("Socket has been created :%d", sockServer);5 R# l$ K6 e6 C1 w5 \8 j; c
  16.     }; S& M% W3 Z0 ]/ n# P
  17.     else{
    9 c1 b$ d" j+ @7 l
  18.         printf("Socket create failed.");3 A$ d( e5 S  P* Q: h/ a
  19.         exit(0);
    2 ?$ X# O  j/ {
  20.     }
    ; p$ \, a$ m. R/ h. q
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);1 V" \( L. G7 N3 g0 G
  22.     serveraddr.sin_family = AF_INET;
    1 c9 L4 X- r* y
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
    , P. u+ D' f8 N9 V& Q
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
    ; ~' L/ M8 o+ i7 E
  25.     char recvBuf[100];
    * i7 g7 f* F( |6 C! R9 ~
  26.     int len = sizeof(SOCKADDR);( i- @5 d5 D) ?; D4 G
  27.     listen(sockServer, 5);//5为等待连接数
    ' v' [; C0 ~5 J" J- n6 C
  28.     while (1){  T% |  j0 ]8 t+ c' s# h# @
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    + d6 X4 E/ P, E( ^; q
  30.         //接收客户端数据
    ; s' g3 G" d9 f0 K4 |! ~
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
    ) {9 H$ _8 C! U0 l  g7 r
  32.         printf("to me:%s\n",recvBuf);
    $ A: N) L  Y; l) x8 [: M
  33.         memset(recvBuf, 0, 100);) o8 Y; e# J+ G2 ?7 |) _& W) ]
  34.     }
    * {7 N! n& J( y9 l' D/ V5 ]' f
  35.     closesocket(sockClient);; w+ G2 V- a( e; d* K, t
  36.     system("pause");
    $ p. \- S0 J4 z" Z/ f& P
  37.     return 0;
    * n: S. e6 O: ?1 E7 w8 p
  38. }
复制代码
客户端代码:
* B0 D- ^) ]' `% `% u
  1. #include<winsock2.h>
    5 j! Y$ V4 I" S; Q5 [
  2. #include<stdio.h>
    6 Y8 W; Y* _; ^- }7 v
  3. #pragma comment(lib, "ws2_32.lib")' T3 R5 n2 I4 b5 f! J& S1 }
  4. void main(); _1 k8 j% I3 O! C9 h
  5. {
    9 R5 v) n9 V- i: A6 j- s) Q, R
  6.     WSADATA wsaData;3 }8 O: ]- z7 }7 A
  7.     SOCKET sockClient;//客户端Socket
    % n1 H8 S0 K- X4 h$ f  J! w$ @  p, r
  8.     SOCKADDR_IN addrServer;//服务端地址
    1 q' G# [3 p% l3 Y# M3 X
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);) P0 b( E/ D/ p5 d: z
  10.     char message[20] = "HelloSocket!";" @  r" v' G. i4 f6 v3 L9 j
  11.     //定义要连接的服务端地址
      {/ h  m) q1 K2 G2 z4 s  H, t! h
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    7 a/ \) r1 R2 v; H
  13.     addrServer.sin_family = AF_INET;+ U$ o9 d2 ]/ p7 ~0 G
  14.     addrServer.sin_port = htons(6000);//连接端口60000 g  o0 r* {0 c, H
  15.     //新建客户端socket& T/ N1 M  S6 g- a8 Y
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);1 X: G1 p$ s8 f( K5 r
  17.     int s = 0;
    8 B; j7 o1 ^' f( x0 S
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));- F( n  k( C% n+ E7 x! l8 G7 o

  19. ; R2 |! Y+ b( L6 [4 f# ]
  20.     while (1){
    ' N& {9 Y" R* f' p/ b8 ^' v4 b
  21.         //发送数据
    # {* y% q, d* F3 R* d! c1 l0 n7 a' p
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);& r* o, ~: P; Z+ q8 \
  23.         printf("to server:");0 n! J9 I6 L/ N5 M& a
  24.         scanf("%s", message);
    3 F, {$ G9 W8 y8 {6 L

  25. $ x  h& @- O0 a0 ]4 B
  26.     }
    % g) r/ ]8 v1 I7 R$ S, m4 T
  27.     //关闭socket& L% k3 T3 P4 l
  28.     closesocket(sockClient);2 s* V2 d9 p2 @2 u/ w
  29.     WSACleanup();2 W# Z' Z- B: K) `! o
  30. }
复制代码
求懂的高手来解答一下。& T4 Z- e. n6 E* h
谢谢了!4 l, U' W" D2 A& g7 W* c6 O
% J, d3 _% v9 E5 a4 {6 s; z' O- y
) B" }) |0 e% O7 Z6 H& M3 s
3 R7 L9 @0 b3 d( L8 p
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
( [1 o0 L; S: Q- H7 ]$ u) urecv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2024-5-19 06:57 , Processed in 0.110172 second(s), 18 queries .

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