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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
大家好,感谢你的回复。- q$ E4 J3 A3 ]* M. Z
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。1 l- e2 z3 ?+ x& h9 |% |, w
Talk is cheak , show me the code.8 [) d1 U/ r% F( t7 \( b
服务端代码:) D/ S. J( g4 J1 c0 U1 E! z
  1. #include<stdlib.h>- W  U* a3 l3 {$ f  Z" T, L+ ^
  2. #include<WinSock2.h>
    4 d$ _3 t; x7 ^  G
  3. #pragma comment(lib,"ws2_32.lib")# S5 L1 ^  ~6 t  g
  4. int main(){# {- O9 m: G# c! p% }+ s# S9 Q, p
  5.     WSADATA wsd;: ?% q7 P: `+ X% \
  6.     SOCKET sockServer;* l7 Y* o4 ]. T, p8 _4 Y8 ~9 n2 ?
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号, D1 q4 _0 r# K
  8.     SOCKET sockClient;8 Z& e- s, P2 u, Q8 N, w! a: C3 e
  9.     SOCKADDR_IN clientaddr;9 @9 y, e; r+ y& ?* S  @. Y
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口- ?5 G5 D8 @) I0 N- C- O
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
    . y( s( M* U1 Q. v; r$ S7 U- q- x' d
  12. % V5 @5 g- v- y) i$ ^, d# ~$ ?

  13. * ^; i9 i, C: q: L. n- [( _& v
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){
    ' m- Q0 H" D2 R' k: [7 Y
  15.         printf("Socket has been created :%d", sockServer);
      }, r# [1 m+ F. r) l
  16.     }# x0 l3 l! Z3 N: C
  17.     else{9 Y3 z. x. F. l! u) ~
  18.         printf("Socket create failed.");
    : a: j% e! _% `* @' I: O6 Q6 z7 @
  19.         exit(0);
    , T" i! e4 ^& M# v' j! V; O; A$ F
  20.     }
    / E9 l# W: N$ o# @& }0 F
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);; }1 ^# Q! {9 X' {' ]
  22.     serveraddr.sin_family = AF_INET;
    4 P/ Z+ O. U" K& q
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000) T4 b) z; R: R% @3 P% S
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
    ! ^1 q, p, C3 M( M$ O& F( }( ^9 V
  25.     char recvBuf[100];" E1 j9 ?4 [8 G* C( W/ f
  26.     int len = sizeof(SOCKADDR);
      Z0 v. `% F! @, f/ A1 \! L
  27.     listen(sockServer, 5);//5为等待连接数2 ^- X- R+ U; \, p& s; J
  28.     while (1){  l- \) x3 x. L. ?
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);" ]/ [$ \- g3 |# c
  30.         //接收客户端数据/ ?# V* s# N- `" R, n
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);9 k* @( r: e$ w  K5 S) m3 i! W" ]
  32.         printf("to me:%s\n",recvBuf);
    0 G5 M3 w+ M. t2 r
  33.         memset(recvBuf, 0, 100);0 g) m( x; A" C" m
  34.     }- D! P$ g+ r2 ?
  35.     closesocket(sockClient);9 g! r" ]# k! F8 J/ E- N
  36.     system("pause");, W3 N7 x; j; n1 k. C
  37.     return 0;/ J: r5 w& R- R3 s  P4 L
  38. }
复制代码
客户端代码:
/ Q1 `2 ]* u) d- e
  1. #include<winsock2.h>
    & N  X' m( q: o: Y: a
  2. #include<stdio.h>
    + G. z4 k& z4 ^6 _3 \1 R
  3. #pragma comment(lib, "ws2_32.lib")4 g+ E, [- Q/ p$ J; \
  4. void main()
    ) |9 _7 t! j4 L5 M& g: h
  5. {: g, g+ i+ H4 q( `5 Y# }
  6.     WSADATA wsaData;8 m* Q6 ^" z' L: s% m
  7.     SOCKET sockClient;//客户端Socket
    , a  o- J  V5 o8 G% v
  8.     SOCKADDR_IN addrServer;//服务端地址% \; ?' |5 _3 v% q) n" P' ?( Y: [
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);
    0 y  Q4 n1 ?# m9 H# M7 ]
  10.     char message[20] = "HelloSocket!";7 ^+ {: b7 G6 K; c# n" E' u2 W
  11.     //定义要连接的服务端地址
      N# y0 n7 @" h8 W0 ?1 \0 Q- E+ u. I
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    0 |9 ^  ?" q. u- ?. G/ n
  13.     addrServer.sin_family = AF_INET;' h% K% ?# ]. K& G) [: p
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    . e8 K2 B) e/ T# C' a/ W
  15.     //新建客户端socket% Z4 j9 {3 ^. ~! X/ f) ^
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);% G5 }1 _( Z' r" N6 k9 B& d2 Q
  17.     int s = 0;
    3 c3 o) E# p! r% k1 R9 c7 |
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));, w: u, ^$ }/ u; l/ d  S2 ~# A
  19.   h7 I3 n+ g3 X# }
  20.     while (1){
    ! |* T( R$ _9 y4 C3 o
  21.         //发送数据
    3 _9 l: q% q" A0 \8 W
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);, t3 P$ d" g7 T% P6 q' Z
  23.         printf("to server:");' i  ~2 m, r  i1 _
  24.         scanf("%s", message);1 C# h. I" v) u1 I

  25. # s. I" _8 N$ L; k) {4 \( G5 g2 J+ C
  26.     }
    * f! I0 Q4 b/ d' K0 |4 I7 s1 W
  27.     //关闭socket4 _0 o3 f: f# m* X* {
  28.     closesocket(sockClient);& Z; L' {3 y- H2 j! S
  29.     WSACleanup();
    ) N! B) g# X1 k: B5 B% i
  30. }
复制代码
求懂的高手来解答一下。! |# N0 `. h3 Q( Z
谢谢了!& h/ G5 p; ]' ^! d8 e" x/ `% A

9 J2 T9 l% N' \# M# [0 _" C
: e0 M9 K* J, b- @2 |) k4 V/ W3 p5 N, y' }1 J# W. ]8 O5 w7 h
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为4 N2 v" G6 J0 n( M% L# m) o4 [
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

本版积分规则

GMT+8, 2026-9-22 04:11 , Processed in 0.061561 second(s), 19 queries .

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