c版socketserver

2023-10-11 11:58
文章标签 socketserver

本文主要是介绍c版socketserver,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

下面将编写一个c/s结构的程序,主要功能是client将向server发送一些消息,而当server收到client的请求时,并向client发送一条回应信息。

server.c代码如下:

#include <stdio .h>
#include < stdlib .h>
#include < errno .h>
#include < string .h>
#include < sys /types.h>
#include < netinet /in.h>
#include < sys /socket.h>
#include < sys /wait.h>#define SERVPORT 3333 
#define BACKLOG 10
#define MAXSIZE 1024int main() {int sockfd,client_fd;struct sockaddr_in my_addr;struct sockaddr_in remote_addr;//创建套接字if ((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1) {perror("socket create failed!");exit(1);}//绑定端口地址my_addr.sin_family      = AF_INET;my_addr.sin_port        = htons(SERVPORT);my_addr.sin_addr.s_addr = INADDR_ANY;bzero(&(my_addr.sin_zero),8);if (bind(sockfd, (struct sockaddr*)&my_addr, sizeof(struct sockaddr)) == -1) {perror("bind error!");exit(1);}//监听端口if (listen(sockfd, BACKLOG) == -1) {perror("listen error");exit(1); }while (1) {int sin_size = sizeof(struct sockaddr_in);    if ((client_fd = accept(sockfd, (struct sockaddr*)&remote_addr,&sin_size)) == -1) {perror("accept error!");continue;}printf("Received a connection from %s\n", (char*)inet_ntoa(remote_addr.sin_addr));//子进程段if (!fork()) {//接受client发送的请示信息int rval;char buf[MAXSIZE];   if ((rval = read(client_fd, buf, MAXSIZE)) < 0) {perror("reading stream error!");continue;}printf("%s\n",buf);//向client发送信息char* msg = "Hello,Mr hqlong, you are connected!\n";if (send(client_fd, msg, strlen(msg), 0) == -1) perror("send error!");close(client_fd);exit(0);} close(client_fd);}return 0;
}
编译并启动服务
这里我们的server已经作为一个服务后台运行,如果想知道后台的服务的运行状态,可能使用netstat来查看.




hqlong@ubuntu:~/t$ netstat -nl | grep 3333
tcp        0      0 0.0.0.0:3333            0.0.0.0:*               LISTEN


可以看出3333端口已经在监听,这说明服务已经启动。
为了测试server是否可以接受client的请求,可以使用telnet来进行测试。


hqlong@ubuntu:~$ telnet 127.0.0.1 3333
Trying 127.0.0.1...
Received a connection from 127.0.0.1
Connected to 127.0.0.1.
Escape character is '^]'.
test
test
 
Hello,Mr hqlong, you are connected!
Connection closed by foreign host.


可以看出,我们使用telnet来连接刚所启动的server,然后向该server发送了一条信息”test”,server收到了这条信息后,向client发送了一条响应信息,告诉我们,我们已经连接上了。

hqlong@ubuntu:~$ gcc server.c -o server
接下来来编写自己的client程序,完成的功能和上面的telnet的测试功能一样,向server发送一条信息,server在收到这条信息后,向client发送一条响应信息。
代码如下:client.c


#include < stdio .h>
#include < stdlib .h>
#include < errno .h>
#include < string .h>
#include < sys /types.h>
#include < netinet /in.h>
#include < sys /socket.h>
#include < sys /wait.h>#define SERVPORT 3333
#define MAXDATASIZE 100
#define SERVER_IP "127.0.0.1"
#define DATA  "this is a client message"int main(int argc, char* argv[]) {int sockfd, recvbytes;char buf[MAXDATASIZE];struct hostent *host;struct sockaddr_in serv_addr;if (( sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {perror("socket error!");exit(1);}bzero(&serv_addr,sizeof(serv_addr));serv_addr.sin_family    = AF_INET;serv_addr.sin_port      = htons(SERVPORT);serv_addr.sin_addr.s_addr= inet_addr(SERVER_IP);if (connect(sockfd, (struct sockaddr *)&serv_addr,sizeof(struct sockaddr)) == -1) {perror("connect error!");exit(1);}write(sockfd,DATA, sizeof(DATA));if ((recvbytes = recv(sockfd, buf, MAXDATASIZE,0)) == -1) {perror("recv error!");exit(1);}buf[recvbytes] = '\0';printf("Received: %s",buf);close(sockfd);return 0;
}

hqlong@ubuntu:~$ gcc client.c -o client
hqlong@ubuntu:~$ ./client
Received a connection from 127.0.0.1
Hello,Mr hqlong, you are connected!
Connection closed by foreign host.


以上就是整个服务器端和客户端程序的编写。
。服务器程序建立了一个socket,并调用bind函数将此socket 和本地协议端口联系起来,然后用listen和accept函数将此socket参数置于被动的监听模式并接收到建立连接。
客户程序也建立一个socket,接着调用connect函数启动网络对话。在客户和服务器建立连接以后,就可以用read、write等函数进行通信了。

这篇关于c版socketserver的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/187868

相关文章

python标准库之SocketServer

 转载自:http://blog.csdn.net/lyin_c/article/details/20478429  源自官方: socketserver简化了网络服务器的编写。   socketserver内包含了四个基于网络服务的类: 1.TCPServer:使用TCP协议,提供在客户端和服务端进行持续的流式数据通讯。 2.UDPServer:使用UDP数据包协议,这是一种不

python基础之socket与socketserver

---引入 Socket的英文原义是“孔”或“插座”,在Unix的进程通信机制中又称为‘套接字’。套接字实际上并不复杂,它是由一个ip地址以及一个端口号组成。Socket正如其英文原意那样,像一个多孔插座。一台主机犹如布满各种插座(ip地址)的房间,每个插座有很多插口(端口),通过这些插口接入电线(进程)我们可以烧水,看电视,玩电脑……   应用程序通常通过"套接字"向网络发出请求或者应

38 - 网络编程-socketserver

38 - 网络编程-socketserver   目录 1 socket编程弊端2 SocketServer模块 2.1 服务器类2.2 Mixin类2.3 RequestHandlerClass是啥2.4 编程接口3 实现EchoServer4 聊天室   1 socket编程弊端 socket编程过于底层,编程虽然有套路,但是要写出健壮的代码还是比较困难的,所以很多语言都会sock

socketserver 模块实现并发及文件下载程序

上章回顾 在讲解 socketserver 模块之前先补充一下上一章节的一个示例: 实现客户端从服务端下载文件的功能,能hash校验(Windows和Linux测试成功,代码比较low仅供观望) 服務端 # coding=utf-8from socket import *import jsonimport structimport os,hashlibserver = sock

Socket与SocketServer结合多线程实现多客户端与服务器通信

需求说明:实现多客户端用户登录,实现多客户端登录一般都需要使用线程技术: (1)创建服务器端线程类,run()方法中实现对一个请求的响应处理; (2)修改服务器端代码,实现循环监听状态; (3)服务器端每监听到一个请求,创建一个处理线程; 关于Socket与SocketServer介绍我这里不多说了,网上很多资料,这里推荐一个 http://www.cnblogs.com/rond/p/356

Python——socket和socketserver

转发自python基础之socket与socketserver 引入 Socket的英文原义是“孔”或“插座”,在Unix的进程通信机制中又称为‘套接字’。套接字实际上并不复杂,它是由一个ip地址以及一个端口号组成。Socket正如其英文原意那样,像一个多孔插座。一台主机犹如布满各种插座(ip地址)的房间,每个插座有很多插口(端口),通过这些插口接入电线(进程)我们可以烧水,看电视,玩电脑……

Socketserver的运用(一)

在TCP通信中,是Client/Server的工作模式,而在这篇文章中,将主要利用python的Socketserver模块去开发一个简单的服务器。 首先,我们要选择好满足自己需求的服务器类型并将需要用到的模块进行import: from socketserver import ThreadingTCPServer, StreamRequestHandlerfrom http import

socket,socketserver,tcp黏包问题,网络编程

1,socket的使用 基于TCP的socket的使用TCP是有链接,面向流的,客户端和服务端一旦连接,不在断开的时候是不会断的简单使用 1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 # @time : 2019/6/13 19:36 4 # @Author : aolishuai 5 # @File

Python3 网络套接字(socket / socketserver)

Python3 网络套接字(socket / socketserver) 本文由 Luzhuo 编写,转发请保留该信息. 原文: http://blog.csdn.net/Rozol/article/details/72553736 以下代码以Python3.6.1为例 Less is more! socket #!/usr/bin/env python# codin