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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。
9 z$ \8 w9 ]0 B1 e' `# d3 _0 v我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。- ?1 S2 J$ p6 |! k) ]
Talk is cheak , show me the code./ y1 M: D8 l% m1 K2 w8 C% ?
服务端代码:
, A) C& G/ Q! @9 {
  1. #include<stdlib.h># G. e' \/ s7 Y7 D6 v5 J
  2. #include<WinSock2.h>. w( |4 J  T6 n8 W
  3. #pragma comment(lib,"ws2_32.lib")
    & q: e5 C0 U7 @- T* M) l
  4. int main(){
    ! ]+ v) i, s- l9 j" ^" n
  5.     WSADATA wsd;' C9 `( b+ w0 p
  6.     SOCKET sockServer;- i% C( Z( P/ N  H/ t0 h
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号
    # i) K" m, L! L# Y* \7 u4 Z
  8.     SOCKET sockClient;
    * q( Z* m5 p( t1 I) f
  9.     SOCKADDR_IN clientaddr;: K0 Q1 {9 H4 \/ m: ]2 L
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
    ; u8 J$ G( d1 H& k" X
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket. E4 U( V6 s7 M1 S0 u: Z
  12. ' M. j  L$ K7 ]7 I; I
  13. # P5 E$ O4 t) {) p
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){
    ; O( @8 i. v2 p5 X7 G
  15.         printf("Socket has been created :%d", sockServer);
    ) h( e  |) R9 ^) U9 m
  16.     }
    7 f5 O- ]* f5 G$ k' o
  17.     else{& Q4 m' f5 T, P; G2 s: @; j! k  K# s
  18.         printf("Socket create failed.");* j% Q7 Z+ T/ a5 W' A( {
  19.         exit(0);
    % x! q: l7 Y( g3 A
  20.     }+ X# c# g  m0 F4 [4 p& h/ T" j, T
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    : x, e5 s$ u  N& r9 A* E
  22.     serveraddr.sin_family = AF_INET;0 W3 Y( X  \& \" S6 J; F5 R4 Y. |
  23.     serveraddr.sin_port = htons(6000);//绑定端口60004 I8 f. L) X/ V3 X
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));9 m- l# c  a2 p$ u
  25.     char recvBuf[100];
    , S& Z6 b1 n& ?9 a+ N. H1 V
  26.     int len = sizeof(SOCKADDR);. ]; s9 I- f7 R8 y, x
  27.     listen(sockServer, 5);//5为等待连接数
    2 U) I/ o1 [) y" J
  28.     while (1){) [, S( _+ m: X7 {! o
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    ) H; n+ N% L* p% F/ i0 C3 r2 w
  30.         //接收客户端数据
    ; d  d# R  K0 ]4 R% H; G
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);8 N6 ?. ^$ s8 n$ Y2 T& D
  32.         printf("to me:%s\n",recvBuf);
    ) z5 ?* U0 x& u  d4 v9 h
  33.         memset(recvBuf, 0, 100);
    0 Z+ Z: t( T7 h# _' A% S& F
  34.     }, @* t6 ]9 C; ?. J# m
  35.     closesocket(sockClient);# }. o" f, \0 g& a
  36.     system("pause");
      m$ L* A' ~+ i- c" u) \7 V3 L$ X
  37.     return 0;  B2 I1 d5 P1 L) C; {
  38. }
复制代码
客户端代码:
) `0 A, A# e  B# t7 \& L" c1 U
  1. #include<winsock2.h>
    $ N; D4 H9 s; d7 x
  2. #include<stdio.h>
    7 m0 y2 ]# E) `
  3. #pragma comment(lib, "ws2_32.lib")* w' n" e2 t' ?: u& X2 `
  4. void main()$ p: g6 b# a, u* C' m/ ^# T% {$ i; O
  5. {
    # P, i' g; U1 m2 Z
  6.     WSADATA wsaData;
    ! [+ k  u% v! s7 [* N9 Y- O) A, ]
  7.     SOCKET sockClient;//客户端Socket
    " `# D5 F3 F3 z% a: {8 E* u
  8.     SOCKADDR_IN addrServer;//服务端地址: T; k" x# R  u2 u( ^
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);8 H; z& U6 B& f4 X9 R2 H
  10.     char message[20] = "HelloSocket!";( p% E, l7 r+ u$ P* B
  11.     //定义要连接的服务端地址
    7 {: Y  U) L1 z
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    % C# D2 E' D7 T
  13.     addrServer.sin_family = AF_INET;
    6 f0 d; a2 L6 Z, I. }
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    / z$ Z) i# m, `% g# I
  15.     //新建客户端socket" o8 N8 u4 q( C- w
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    9 n" G# ]6 [# ]
  17.     int s = 0;) r% i. R# |9 t, K: x, ^2 M
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    ( G. q' q: V. Z: v* ]4 t( g

  19. ; P1 @  X% x! A$ p4 S$ G, ]+ L
  20.     while (1){" t3 A7 ^6 q- G' A5 ~6 g
  21.         //发送数据
    ( ^& j# h* S( f: U) T
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);
    ; m8 q) @% {. ~  S* p, Z
  23.         printf("to server:");
    # e1 }& R$ v' F
  24.         scanf("%s", message);
      L! {9 r+ T- B' l8 J- V

  25. ; |% K/ U  d4 c8 Q5 Y1 X# M
  26.     }
    # R5 N' _% J" w8 C. W9 B4 G' y
  27.     //关闭socket4 Y0 n, o4 ?9 m
  28.     closesocket(sockClient);: m2 S; J4 G4 Z
  29.     WSACleanup();
    . N% w( ?( v: H) k) N, b4 S7 m9 a8 P
  30. }
复制代码
求懂的高手来解答一下。
: B6 C0 ]( a; y9 Y) [% C7 Z0 t8 n/ R谢谢了!7 V5 ?1 I8 d8 h3 {1 P) O

9 b2 G8 N5 v& w
3 s0 J( ?8 A  K$ \4 ?( T# ^/ ^/ d# _5 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); 这句改为* Y$ l/ |( v0 G6 V$ a
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2026-6-4 10:41 , Processed in 0.081540 second(s), 19 queries .

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