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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
大家好,感谢你的回复。9 d& k3 D% F8 T  ^* z
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。8 p% ?4 w; a) W  @2 x
Talk is cheak , show me the code.6 R" ?! B, F4 a/ j1 o. O% r/ U
服务端代码:
' a; M7 w% f  ?4 G, {' r) D
  1. #include<stdlib.h>, }& ~/ H, K& a$ B) x$ v: |
  2. #include<WinSock2.h>9 V& m+ R" a4 U9 B: y2 r/ j7 T
  3. #pragma comment(lib,"ws2_32.lib")) t9 v8 C5 g* [2 a7 v4 L
  4. int main(){$ L6 c9 g, E  q9 Q
  5.     WSADATA wsd;
    7 R) L6 G# R6 k6 x6 l  J
  6.     SOCKET sockServer;  i: Z! Y5 R* m8 k2 q9 U
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号$ g/ s, e3 T* A* i
  8.     SOCKET sockClient;  g! M2 G+ ^  ?8 o! K
  9.     SOCKADDR_IN clientaddr;) o1 i: B/ t2 x- E" s
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口; F- ^% t7 Q: U4 @9 ?
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
    ( K$ t9 L- T9 u6 E- G' q* v

  12. " G0 Q8 m" e( D; c5 x
  13. 3 G( C" m# j# Q& O+ P3 B
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){
    ( b' v7 l$ j' D( l
  15.         printf("Socket has been created :%d", sockServer);' s5 h8 A( X" o: m7 v
  16.     }/ @* o& u$ E0 X6 W
  17.     else{
    6 s: J  X3 Y6 G, Z* V# @9 b! a7 {
  18.         printf("Socket create failed.");
    : x/ ?3 M. x: Y6 s
  19.         exit(0);
    : R/ ]2 F1 |8 L$ E4 M, A) I) Z; A7 E
  20.     }# `) U" J8 d8 S& {2 N( O
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    + q8 ^4 X9 \  U5 g7 `
  22.     serveraddr.sin_family = AF_INET;" y$ J7 f7 u" s/ Y4 A
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000  ]/ X. c( Q& w/ [
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));! K/ u1 ~8 S0 E9 Z  S
  25.     char recvBuf[100];
    9 `: H( G: D, V3 K0 r8 F( h
  26.     int len = sizeof(SOCKADDR);0 j: |9 ^4 C0 T! x$ Z! x
  27.     listen(sockServer, 5);//5为等待连接数
    - @4 d9 j# s) y8 i' w2 @$ |% f1 u
  28.     while (1){- j2 L3 z9 v. O$ Z: A( s# a
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    ; A& l, a( E, L0 |7 I9 u- _7 v
  30.         //接收客户端数据+ d5 e+ P9 d# w) ~
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
    3 }' G8 a. Z# q4 j- c7 ?# A
  32.         printf("to me:%s\n",recvBuf);
    5 W1 G2 o* X+ V  w9 W* ?
  33.         memset(recvBuf, 0, 100);7 l& p( S, {; W( ~/ J1 X8 }, S
  34.     }
    " m& f. O& z: {9 p6 `
  35.     closesocket(sockClient);
      S1 F; Y* g# c% b, q& ?. T2 v5 R
  36.     system("pause");. ]3 y# `) ^! P( q* i* m
  37.     return 0;
    ! E9 W' J! E9 }
  38. }
复制代码
客户端代码:
. c3 h7 [" Y2 _& D; U/ f3 W
  1. #include<winsock2.h>
    7 q# }  L* \% P. b
  2. #include<stdio.h>
    , M  N- W/ C5 T! ?5 c3 u! A$ l
  3. #pragma comment(lib, "ws2_32.lib"). V) b3 F' Q8 I! s
  4. void main()' M5 Q1 ]1 h4 _* o) M
  5. {. a% v: ]& a6 ~
  6.     WSADATA wsaData;
    " C  H4 V* z( ~" X( |' s# V
  7.     SOCKET sockClient;//客户端Socket  o! C  W3 x9 I/ A  W7 R" \
  8.     SOCKADDR_IN addrServer;//服务端地址) S" f$ }2 S6 o5 \" @
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);- |0 Q3 ~. B3 u& m6 r. @: ?7 Q
  10.     char message[20] = "HelloSocket!";2 Y- e9 L/ z9 s( N3 _2 B
  11.     //定义要连接的服务端地址4 ]# Z8 |. |% A, S6 P" O/ r, _5 X: J$ w
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)7 G  R( g/ V3 z2 u$ R( R+ C
  13.     addrServer.sin_family = AF_INET;
    ) E# `4 E, U- r. y# X
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    3 s& S' Y. q, r8 N. M% m
  15.     //新建客户端socket- H: d* k1 K+ q# I
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    * q& r0 Z6 o' c+ [# @+ M% O+ }
  17.     int s = 0;2 I! Y: f( {: V
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));0 s# _" l9 }3 x
  19. , u' H, l+ N! C% K; v5 G
  20.     while (1){
    9 o) C; ~; A( v5 P- b
  21.         //发送数据
    9 Q* V. ^" o3 \' i4 b4 @; _
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);
    1 F9 V8 _' q6 |; N
  23.         printf("to server:");, |& K1 Y. ?0 B* g- s0 i. R
  24.         scanf("%s", message);
    2 ^7 C' I4 Z. g7 J& X
  25. 1 ~: t, p/ }2 v8 y& L8 D
  26.     }1 J! G5 C' H& z. z" v7 a
  27.     //关闭socket
    2 {3 c* Z2 |& ?1 P4 {6 N: K
  28.     closesocket(sockClient);
    ) z0 [0 c& x$ j! W) F! l9 \
  29.     WSACleanup();$ _, W' v0 i& T: s- I
  30. }
复制代码
求懂的高手来解答一下。
' w0 @7 h* [! G+ @4 s谢谢了!8 u3 g( I: D( N; y- Y* P

8 |- ]. z6 a" c+ J( j
, Y9 L' A4 l6 V: C1 W3 F' h; d, R8 h: W
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为! O% m: a% o  W* A8 U2 R2 e
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2026-8-4 08:11 , Processed in 0.054723 second(s), 19 queries .

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