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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。; |& n+ n! |4 i' ?+ p% v
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
8 @% ]7 z$ {( g+ g* g! WTalk is cheak , show me the code.
7 L$ x  }+ W' e6 ^0 g* \0 d5 [" F( V% _服务端代码:
  k* x. p* [$ e% G: b; [3 N: J/ v
  1. #include<stdlib.h>4 }  n; P4 s5 i4 X4 b/ E6 D
  2. #include<WinSock2.h>0 ]) z1 D+ r! d+ e0 Y
  3. #pragma comment(lib,"ws2_32.lib")
    ( O+ r" [# \( w! S5 y9 i
  4. int main(){& }! b0 Y7 y) ?3 j( t" v$ W
  5.     WSADATA wsd;
    1 H( C; v  k" Q6 j# \
  6.     SOCKET sockServer;
    - _  l( X" _& x
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号
    1 b7 s  }; O# c) y, ], t
  8.     SOCKET sockClient;2 z# M2 g; v3 h# c! o" c$ S
  9.     SOCKADDR_IN clientaddr;3 g1 y" p( ^1 h$ ]+ [
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口$ x& I- d! b6 A% _2 d
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
    7 _3 v$ \/ J' P5 H; q7 S1 _
  12. ( K5 F2 l$ \- Q4 V- f5 y7 f1 q( S

  13. & {: j) D$ _2 h7 H& a7 w, v) R
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){
    ) Q% x* g4 ~  Z+ K# M- q  n0 _
  15.         printf("Socket has been created :%d", sockServer);5 o: h$ ?$ ]) }! }3 Q  V0 e- P
  16.     }
    8 a8 p$ ]! X# C
  17.     else{" S5 V- J0 c# H/ U' Z# T
  18.         printf("Socket create failed.");
    3 e  [8 I* r* V: Q# g3 G  l
  19.         exit(0);# o+ o* H7 e: _  b% g6 G
  20.     }: H# `  o+ O7 i5 b4 V
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);; R  L( A, e* }' m+ [
  22.     serveraddr.sin_family = AF_INET;' v% B9 W/ e& F) X- c) k3 q7 \
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
    , q1 j' w* d% F0 i8 P/ G
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
    ) f" G8 G' ?9 E
  25.     char recvBuf[100];
    : k9 n) i% e% c8 ~) C6 \
  26.     int len = sizeof(SOCKADDR);2 F2 E$ U! V% q1 g; Y
  27.     listen(sockServer, 5);//5为等待连接数; G- `. U6 I% o6 `
  28.     while (1){: a6 X( Q% w3 z- @
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);* }6 p0 Z8 O7 `' y$ u9 t5 }  C
  30.         //接收客户端数据6 p( l; _) w1 ^- r
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);. m5 ^5 X( c, P
  32.         printf("to me:%s\n",recvBuf);
    - R5 y& ~8 k+ H/ z
  33.         memset(recvBuf, 0, 100);
    6 b4 `/ N' y9 @. c3 {* K
  34.     }
    ' `5 Q1 K2 f) k( m. {$ i0 T9 i
  35.     closesocket(sockClient);
    0 H( }% J/ R6 h, L7 y0 G
  36.     system("pause");9 d! ]; T0 ]1 T9 _+ x* M; F
  37.     return 0;
    " D+ N9 ?- ~" n6 v5 b$ @
  38. }
复制代码
客户端代码:
& G1 ~: d. y4 V( A( X
  1. #include<winsock2.h>0 G- J3 O8 b7 s( x
  2. #include<stdio.h>
    7 S2 v& U7 I$ n2 n+ Y8 t
  3. #pragma comment(lib, "ws2_32.lib"), q4 H0 H  b" i; g1 o  q  u5 X
  4. void main()
    . i" p1 \0 Y8 A9 `' o% }. h  a
  5. {" m* X1 K* j+ [$ L9 B3 C( b
  6.     WSADATA wsaData;
    2 k, h9 u6 j" z. n$ h$ _
  7.     SOCKET sockClient;//客户端Socket: Q% v. Z' h# t; @2 |% l& _8 ^5 Z
  8.     SOCKADDR_IN addrServer;//服务端地址5 E# ~/ c3 @8 M: Z9 V9 f
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);! `- ]; a- l  j9 _* |+ G
  10.     char message[20] = "HelloSocket!";
    3 U" o7 x0 r2 z
  11.     //定义要连接的服务端地址
    7 v- |. ?) ]& X
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)& l4 p1 {* S' ^9 y( l$ A
  13.     addrServer.sin_family = AF_INET;
    # T9 `9 @" b4 l: z: D
  14.     addrServer.sin_port = htons(6000);//连接端口6000+ L* Q) E# r4 X$ R  v) h
  15.     //新建客户端socket
    * m% I  C( t% x5 _
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    % H4 }  t( }; U4 p# a2 G7 ^8 E
  17.     int s = 0;/ I! T9 i8 u  _% m' S  R# h
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    # P! C( E( M- T" E+ @
  19. / ]& C3 U& w& q9 q, c
  20.     while (1){$ o; O& b/ G* ]9 `' s  e
  21.         //发送数据9 C' h; Q& _  X& R" i
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);
    9 b4 u' v  z0 p! \6 U2 T4 Y% A6 Q
  23.         printf("to server:");8 m8 ~5 A: M  e" `: o
  24.         scanf("%s", message);
    ' O/ O7 G7 T, [* g/ M) h

  25. ' B% i$ F- y9 x# u  M" I6 t
  26.     }4 Q' g1 t" [+ D6 G+ \3 E/ C
  27.     //关闭socket
    / _" q! t  d/ K! l& k# X( f7 K: p
  28.     closesocket(sockClient);
    / \: z8 Q8 |, g# e+ r
  29.     WSACleanup();. C8 E% }9 d  C4 ]) H
  30. }
复制代码
求懂的高手来解答一下。. G7 q/ Q1 ^0 O
谢谢了!
" ?7 U: M: B6 ~- x" l' b2 }3 \6 Y
* O$ c5 }" D. G2 _, k) g8 G

7 _; {- B8 F3 R, ?  w( v9 c
6 r( W% @; {1 ~( _
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为3 e/ t# Z: s( d2 B- _
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2026-8-4 07:05 , Processed in 0.064926 second(s), 18 queries .

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