Linux_C socket server.c clinet.c功能分开写

socklib.h1 int make_server_socket(int );
2 int connect_to_server(char* , int );
3 int process_request(int );
4 int talk_with_server(int );

socklib.c

  1 /* socklib.c
  2  * This file contains functions used lots when writing internet
  3  * client/ server programs.    The two main functions here are:
  4  *
  5  * int make_server_socket(portnum) returns a server socket
  6  *                                       or -1 if error
  7  * int make_server_socket_q(portnum, backlog)
  8  *
  9  * int connect_to_server(char* hostname, int portnum) return a connected socket
 10  *                                       or -1 if error
 11  */
 12 #include <stdio.h>
 13 #include <unistd.h>
 14 #include <sys/socket.h>
 15 #include <sys/types.h>
 16 #include <netinet/in.h>
 17 #include <netdb.h>
 18 #include <time.h>
 19 #include <strings.h>
 20
 21 #define HOSTLEN 256
 22 #define BACKLOG 1
 23 #define oops(msg) {perror(msg); exit(1);}
 24
 25 int make_server_socket_q(int , int);
 26
 27 int make_server_socket(int portnum) {
 28   return make_server_socket_q(portnum, BACKLOG);
 29 }
 30
 31 int make_server_socket_q(int portnum, int backlog) {
 32   struct sockaddr_in saddr;
 33   struct hostent *hp;
 34   char hostname[HOSTLEN];
 35   int sock_id;
 36   sock_id=socket(PF_INET, SOCK_STREAM, 0);
 37   if(sock_id == -1)
 38     return -1;
 39   /*bulid socket bind*/
 40   bzero((void*)&saddr, sizeof(saddr));
 41   gethostname(hostname, HOSTLEN);
 42   hp=gethostbyname(hostname);
 43
 44   bcopy((void*)hp->h_addr, (void*)&saddr.sin_addr, hp->h_length);
 45   saddr.sin_port=htons(portnum);
 46   saddr.sin_family=AF_INET;
 47   if(bind(sock_id, (struct sockaddr*)&saddr, sizeof(saddr))!=0)
 48     return -1;
 49
 50   /** arrange for incoming calls **/
 51   if(listen(sock_id, backlog)!=0)
 52     return -1;
 53   return sock_id;
 54 }
 55
 56 int connect_to_server(char *host, int portnum) {
 57   int sock;
 58   struct sockaddr_in servadd;
 59   struct hostent *hp;
 60   /** Step1: get a socket**/
 61   sock=socket(AF_INET, SOCK_STREAM, 0);
 62   if(sock==-1)
 63     return -1;
 64   /**Step2: connect to server**/
 65   bzero((void*)&servadd, sizeof(servadd));
 66   hp=gethostbyname(host);
 67   if(hp==NULL)
 68     return -1;
 69   bcopy(hp->h_addr, (struct sockaddr*)&servadd.sin_addr, hp->h_length);
 70   servadd.sin_port=htons(portnum);
 71   servadd.sin_family=AF_INET;
 72   if(connect(sock, (struct sockaddr* )&servadd, sizeof(servadd))!=0)
 73     return -1;
 74   return sock;
 75 }
 76
 77 int talk_with_server(int fd) {
 78   char buf[BUFSIZ];
 79   int len;
 80   len = read(fd, buf, BUFSIZ);
 81   if(len==-1)
 82     return -1;
 83   if(write(1, buf, len)!=len)
 84     return -1;
 85   return 0;
 86 }
 87 /*
 88 int process_request(int fd) {
 89   time_t thetime;
 90   char *cp;
 91   time(&thetime);
 92   cp=ctime(&thetime);
 93   if(write(fd, cp, strlen(cp)) != strlen(cp))
 94     return -1;
 95   return 0;
 96 }
 97 */
 98 int process_request(int fd) {
 99   int pid = fork();
100   switch(pid) {
101   case -1: return -1;
102   case 0: dup2(fd, 1);
103     close(fd);
104     execl("/bin/date", "date", NULL);
105     oops("execl");
106   default:wait(NULL);
107   }
108 }
/* timeclnt_new.c - a new client for use the socklib.c
 */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <time.h>
#include <strings.h>
#include "socklib.h"

#define oops(msg) {perror(msg); exit(1);}

int main(int argc, char* argv[]){
  int sock_id;
  sock_id=connect_to_server(argv[1],atoi(argv[2]));
  if(sock_id==-1)
    oops("connect_to_server");
  if(talk_with_server(sock_id) == -1)
    oops("talk_to_server");
  close(sock_id);
  return 0;
}
 1 #include <stdio.h>
 2 #include <unistd.h>
 3 #include <sys/types.h>
 4 #include <sys/socket.h>
 5 #include <netinet/in.h>
 6 #include <netdb.h>
 7 #include <time.h>
 8 #include <strings.h>
 9 #include "socklib.h"
10
11 #define oops(msg){ perror(msg); exit(1);}
12 #define PORTNUM 13000
13 int main(void ) {
14   int sockid, fd;
15   sockid=make_server_socket(PORTNUM);
16   if(sockid==-1)
17     oops("make_server_socket");
18   while(1){
19     fd=accept(sockid, NULL, NULL);
20     if(fd==-1)
21       break;
22     process_request(fd);
23     close(fd);
24   }
25   return 0;
26 }
时间: 2024-10-12 21:09:24

Linux_C socket server.c clinet.c功能分开写的相关文章

java网络编程socket\server\TCP笔记(转)

java网络编程socket\server\TCP笔记(转) 2012-12-14 08:30:04|  分类: Socket |  标签:java  |举报|字号 订阅 1 TCP的开销 a  连接协商三次握手,c->syn->s,s->syn ack->c, c->ack->s b  关闭协商四次握手,c->fin->s, s->ack-c,s->fin->c,c->ack->s c  保持数据有序,响应确认等计算开销 d

python之路 socket、socket server

一.socket socket的英文原义是“孔”或“插座”.作为BSD UNIX的进程通信机制,取后一种意思.通常也 称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信.在Internet上的主机一 般运行了多个服务软件,同时提供几种服务.每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务.Socket正如其英文原 意那样,像一个多孔插座.一台主机犹如布满各种插座的房间,每个插座有一个编号,有的插座提供2

Python开发之路-socket server

1.socket server实现并发 服务端: import socketserver class Myserver(socketserver.BaseRequestHandler): #来一个链接产生一个实例 def handle(self): #定义了一个通信循环的功能 print('conn是:',self.request) #相当于conn 既accept接收到的连接 print(self.client_address) #相当于addr 既accept接收到的addr地址 while

用select模拟一个socket server

1, 必须在非阻塞模式下,才能实现IO的多路复用,否则一个卡住就都卡住了. 先检测自己,现在没有客户端连进来,所以会卡住. # 用select去模拟socket,实现单线程下的多路复用 import select import socket import queue server = socket.socket() server.bind(('localhost', 9000)) server.listen(1024) server.setblocking(False) # 设置为不阻塞,acc

C# Socket Server 收不到数据

#/usr/bin/env python # -*- coding: utf-8 -*- # C# Socket Server 收不到数据 # 说明: # 最近在调Python通过Socket Client连接C#的Socket Server,但是Server端能检测到连接, # 却收不到数据,这个问题困扰了几个小时,最后是因为Python这边发送完数据,直接关闭了 # 连接,最好是sleep一点点时间再关闭Socket,这样就能正常受到数据了. # # 2016-11-09 深圳 南山平山村

Socket.Server &#39;module&#39; object has no attribute &#39;fork&#39; 原因分析

Exception happened during processing of request from ('127.0.0.1', 65066)Traceback (most recent call last): File "C:\Python27\lib\SocketServer.py", line 284, in _handle_request_nobloc self.process_request(request, client_address) File "C:\P

Windows Server 2012 R2 新功能之共用VHDX虚拟磁盘

在Windows Server 2012 R2中有一项新的功能,这个功能的好处是可以在两个系统中同时使用一个VHDX虚拟磁盘.下面我们就在测试一下. 1.在一台服务器上打开磁盘管理点击"操作"--"创建VHD" 2.选择对应的虚拟磁盘存放的位置,这里我们将它存放在共享上. 3.这里可以配置对应的磁盘大小,磁盘类型等,点击"确定" 4.这时候我们对这个磁盘进行联机.初始化.格式化等操作. 5.然后我们在另外一台服务器上点击"操作"

WebLogic Server的单点登陆功能--转载

在WebLogic 8.1最新的 SP4版本中,最引人注目的要算是在安全方面,提供了用于和Microsoft Windows客户端进行Single Sign-On的Single Pass Negotiate Identity Assertion Provider.通过该Provider可以轻松完成从前认为技术难度很高的和Windows客户端的Single Sign-On. 这个简单,低成本的SSO解决方案相信对大多数的企业应用来说更具吸引力: 用户只需要开机时登录Windows域,就可以以登录用

Windows Server 2012启用Windows功能NetFx3时出错解决方法

作者:冰点阳光 | 可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明网址:http://baohua.me/operating-system/windows-server-2012-enable-windows-feature-netfx3-error-sulotion/ 在Windows server 2012 R2服务器上安装SQL Server 2012数据库,在安装过程中出现"启用Windows 功能NetFx3时出错,错误代码:-2146498298.请尝试从Wind