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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。3 X- V' |8 i6 f/ C0 p
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。: z% j) @6 G" G: S% k) ]- c
Talk is cheak , show me the code.- F3 k5 {) j5 [$ L
服务端代码:% U7 Y5 U: @: b0 J0 j, e! @
  1. #include<stdlib.h>. [5 G( `) E# |' v' o8 P
  2. #include<WinSock2.h>) x) z* m# g# H% D
  3. #pragma comment(lib,"ws2_32.lib")7 w* d, @( t- C6 e' V; o) |( X
  4. int main(){) P) m5 s7 {2 C3 d9 E
  5.     WSADATA wsd;. K7 c3 r6 M6 g: g
  6.     SOCKET sockServer;7 S/ W# \% z: S- s
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号  k9 h5 W+ j" I4 m+ c2 g
  8.     SOCKET sockClient;
    ( F1 ~/ o" }  X" o
  9.     SOCKADDR_IN clientaddr;
    . \$ b$ x0 _7 J7 d
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口7 H8 o. C9 K. [* p# I+ A, ^9 u
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket5 }2 i1 v( ]& p2 V, {0 e, F

  12. * p' j( K" R3 V- ]$ m

  13. 1 p# ^& k* W4 g! A1 {
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){
    * f; S+ l4 O& |: S" V! ^* [' K( Y( H1 a
  15.         printf("Socket has been created :%d", sockServer);
    2 k" {2 W# j" b
  16.     }1 Z+ k0 {: O9 t
  17.     else{, Q& }9 k0 Y# S9 Z% m& y% Z2 C$ L/ Z
  18.         printf("Socket create failed.");- l/ @+ C$ b; l" ?
  19.         exit(0);
    5 e1 {2 b' g/ g; q+ v' x
  20.     }
    # z+ e! x; `! r3 |
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    * w5 o  {  i/ H( J5 S
  22.     serveraddr.sin_family = AF_INET;7 V" l. ]3 ]! R
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000; d: `/ |* @1 ^0 K, h" z  a" c
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
    ) w/ r! P1 `: x7 [: i+ d
  25.     char recvBuf[100];
    4 ~  _8 `: @+ N) k' ^/ a+ q* X  N
  26.     int len = sizeof(SOCKADDR);
    0 w7 s) m6 I7 F% o$ E$ M% [
  27.     listen(sockServer, 5);//5为等待连接数1 U/ J* ^. h' ]/ u7 o4 ^
  28.     while (1){
    2 k2 O% X# K/ y8 u5 T7 _: y6 M6 ?/ I
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);0 u# @* A+ i* X' E
  30.         //接收客户端数据7 e6 w( {* b9 b) m! t5 k  Z; H
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
    ' F9 G/ ^8 g& `% O, H( k; _% E/ c
  32.         printf("to me:%s\n",recvBuf);
    & w! s8 w; Y9 C8 I9 _
  33.         memset(recvBuf, 0, 100);
    " {! H) d6 H! z
  34.     }
    " ]4 q- V7 r+ b- w+ b
  35.     closesocket(sockClient);
    0 ]' ?1 c5 U% I9 `$ P+ D$ a7 X
  36.     system("pause");# a) l: ~8 z$ w. }! k2 k7 g
  37.     return 0;, Y- {  K; {) n9 I. `: b
  38. }
复制代码
客户端代码:. W) t% R3 }* P7 [0 w8 |
  1. #include<winsock2.h>
    9 |, D# n* C( I4 s( I+ w
  2. #include<stdio.h>
    ) J0 s: J4 k* Y9 }* [- a
  3. #pragma comment(lib, "ws2_32.lib")9 N& ?6 J+ {4 e# M
  4. void main()
    6 ]. ?2 b) |. M8 D* [
  5. {/ b- v' M, s4 O
  6.     WSADATA wsaData;
    0 K9 `" `' I( r- N: A, p0 j: r
  7.     SOCKET sockClient;//客户端Socket
    ; V% v6 j$ H8 {0 j6 Y( u
  8.     SOCKADDR_IN addrServer;//服务端地址
    5 C$ G: f4 s2 m4 M% H
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);5 z) s* f* q* ~" t' y" k% l/ W( U
  10.     char message[20] = "HelloSocket!";) C& N2 N2 ~! l
  11.     //定义要连接的服务端地址3 W4 I) L( H" M$ ^% e  I
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)# M$ P4 ~% @* V$ A2 A4 S7 n
  13.     addrServer.sin_family = AF_INET;4 W; V9 p1 V7 b; D  q) {! y
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    $ F* u' H& L5 O/ F9 V
  15.     //新建客户端socket8 @- O8 ]# z1 {
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);; J1 _/ P9 O; D! D5 L9 Q
  17.     int s = 0;
    $ O( S" Q  M4 n+ k" n8 ]
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));4 g- c% k0 u! a, C
  19. 6 G' s& U4 g. [4 T# z$ |
  20.     while (1){
    # |5 @8 c) w# ~9 x" A) `5 y) Y
  21.         //发送数据
    " o, o% ~" b& U( C
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);  s; Q5 O0 ^' P* |2 ?  z
  23.         printf("to server:");, t8 x& X8 S/ Q7 x# A
  24.         scanf("%s", message);& S0 ?; n+ \) b% w+ Z5 ]

  25. # H. p" t5 v: |8 z
  26.     }
    7 Z' D% M7 M2 F( A. I7 E) S* i. N
  27.     //关闭socket! f3 ~. V( z' ~9 M  M( E
  28.     closesocket(sockClient);# p0 s( o: R3 _- Y
  29.     WSACleanup();
    ! x/ Y* E- v( d# u  w/ Y
  30. }
复制代码
求懂的高手来解答一下。: W4 a$ L7 s- D8 X
谢谢了!
! |! t) b( o) C- V/ O7 M' v: I

. J5 I- `; S$ b' X6 k, u" a3 S8 b( `/ ^' \. N/ G1 v
  l5 g$ G7 T7 C' ~" @* C
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
) T5 p1 n+ B) h1 G7 }/ @- S  erecv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2026-3-17 16:07 , Processed in 0.075499 second(s), 19 queries .

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