1. 程式人生 > >linux c server and client 簡單的通訊

linux c server and client 簡單的通訊

server.c

#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <arpa/inet.h>

int main(int argc, char *argv[])
{
        int sockfd,new_fd;
        struct sockaddr_in server_addr;
        struct sockaddr_in client_addr;
        int sin_size,portnumber;
        char hello[1000]="Hello! Are You Fine?\n";

        if(argc!=2)
        {
                fprintf(stderr,"Usage:%s portnumber\a\n",argv[0]);
                exit(1);
        }

        if((portnumber=atoi(argv[1]))<0)
        {
                fprintf(stderr,"Usage:%s portnumber\a\n",argv[0]);
                exit(1);
        }

        /* 伺服器端開始建立socket描述符 */
        if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
        {
                fprintf(stderr,"Socket error:%s\n\a",strerror(errno));
                exit(1);
        }

        /* 伺服器端填充 sockaddr結構  */
        bzero(&server_addr,sizeof(struct sockaddr_in));
        server_addr.sin_family=AF_INET;
        server_addr.sin_addr.s_addr=htonl(INADDR_ANY);
        server_addr.sin_port=htons(portnumber);

        /* 捆綁sockfd描述符  */
        if(bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)
        {
                fprintf(stderr,"Bind error:%s\n\a",strerror(errno));
                exit(1);
        }

        /* 監聽sockfd描述符  */
        if(listen(sockfd,5)==-1)
        {
                fprintf(stderr,"Listen error:%s\n\a",strerror(errno));
                exit(1);
        }

        while(1)
        {
                /* 伺服器阻塞,直到客戶程式建立連線  */
                sin_size=sizeof(struct sockaddr_in);
                if((new_fd=accept(sockfd,(struct sockaddr *)(&client_addr),&sin_size))==-1)
                {
                        fprintf(stderr,"Accept error:%s\n\a",strerror(errno));
                        exit(1);
                }

                fprintf(stderr,"Server get connection from %s\n",
                inet_ntoa(client_addr.sin_addr));

                fscanf(stdin,"%s",hello);
                if(write(new_fd,hello,strlen(hello))==-1)
                {
                        fprintf(stderr,"Write Error:%s\n",strerror(errno));
                        exit(1);
                }
                /* 這個通訊已經結束     */
                close(new_fd);
                /* 迴圈下一個     */
        }
        close(sockfd);
        exit(0);
}

client.c

#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <arpa/inet.h>

int main(int argc, char *argv[])
{
        int sockfd;
        char buffer[1024];
        struct sockaddr_in server_addr;
        struct hostent *host;
        int portnumber,nbytes;

        if(argc!=3)
        {
                fprintf(stderr,"Usage:%s hostname portnumber\a\n",argv[0]);
                exit(1);
        }

        if((host=gethostbyname(argv[1]))==NULL)
        {
                fprintf(stderr,"Gethostname error\n");
                exit(1);
        }

        if((portnumber=atoi(argv[2]))<0)
        {
                fprintf(stderr,"Usage:%s hostname portnumber\a\n",argv[0]);
                exit(1);
        }

        /* 客戶程式開始建立 sockfd描述符  */
        if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
        {
                fprintf(stderr,"Socket Error:%s\a\n",strerror(errno));
                exit(1);
        }

        /* 客戶程式填充服務端的資料       */
        bzero(&server_addr,sizeof(server_addr));
        server_addr.sin_family=AF_INET;
        server_addr.sin_port=htons(portnumber);
        server_addr.sin_addr=*((struct in_addr *)host->h_addr);

        /* 客戶程式發起連線請求         */
        if(connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)
        {
                fprintf(stderr,"Connect Error:%s\a\n",strerror(errno));
                exit(1);
        }

        /* 連線成功了           */
        if((nbytes=read(sockfd,buffer,1024))==-1)
        {
                fprintf(stderr,"Read Error:%s\n",strerror(errno));
                exit(1);
        }
        buffer[nbytes]='\0';
        printf("I have received:%s\n",buffer);
        /* 結束通訊     */
        close(sockfd);
        exit(0);
}

Makefile

all:server client
server:server.c
            gcc $^ -o [email protected]
client:client.c
            gcc $^ -o [email protected]

相關推薦

linux c server and client 簡單通訊

server.c #include <stdlib.h> #include <stdio.h> #include <errno.h> #include <string.h> #include <unistd.h>

linux下socket通訊serverclient簡單例子

<span style="font-family: Arial, Helvetica, sans-serif;">server.c</span> ===================================================

解決Linuxserverclient 通過TCP通訊:accept成功接收卻報錯的問題

ipv4 socket error 實例代碼 ... lis col argc 例子   今天在寫簡單的TCP通訊例子的時候,遇到了一個問題:server 和client能夠連接成功,並且client也能夠正常發送,但server就是接收不到,在網上搜索一番後,終於解決了問

Linux作業系統之程序通訊——利用共享儲存區實現SERVERCLIENT通訊

實現思路如下: 用fork( )建立子程序,利用共享儲存區實現SERVER和 CLIENT的通訊 SERVER建立一個KEY為75的共享區: 若共享區的第一個位元組為-1 ,則表示空閒。 若共享區的第一個位元組為-1 ,則表示空閒。 若該位元組值發生變化,則

使用linux-c編程實現簡單的ls命令

使用c實現ls命令使用Linux—c編程實現簡單的ls命令 具體代碼如下: 加載的頭文件有stdio.h,sys/types.h,dirent.h,unistd.h,sys/stat.h,fcntl.h,string.h等。 void main(int argc,char **argv){

[pthread]Linux C 多線程簡單示例

簡單 _exit bsp clas flags thread read arm color #include <stdio.h> #include <pthread.h> pthread_mutex_t mutex; pthread_con

The configuration of ftp server and client

This is the first article since April in this year. This is also the first article since I joined Microstrategy. 1 Environment Server: CentOS release 6.8

LINUX網路程式設計---實現TCP簡單通訊

#include<stdio.h> #include<errno.h> #include<string.h> #include<strings.h> #include<unistd.h> #include<stdlib.h> #inclu

Shadowsocks Server And Client

Server sudo apt-get install python python-pip pip install shadowsocks ssserver -c /etc/shadowsocks/config.json -d start

ESP8266例程解析⑥TCP server and client

一、簡介 在網路傳輸應用層中,通常使用TCP和UDP這三種協議實現資料的傳輸。在傳輸過程中,需要雙向的通訊連線實現資料的互動。因此,在這雙向鏈路的一端稱之為socket,一個socket有一個IP地址和埠號。 目前流程的網路程式設計模型是客戶端/服務端(C/S)結構。

Python TCP Server And Client

''' Python socket TCP多執行緒伺服器 by 鄭瑞國 1、建立網路套接字s 2、繫結地址 3、監聽 4、接受客戶端連線 5、多執行緒處理客戶端訊息 ''' import socket import threading def server_handle(client,addr)

linux C之setitimer函式簡單使用

在說setitimer函式之前, 先來說說alarm函式: unsigned int alarm(unsigned int seconds); alarm函式會建立一個定時器, 在seconds秒後, 給當前程序傳送SIGALRM訊號. setitimer也用來建立定時器,

linux C學習之實現簡單的web伺服器

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h

Thrift c++ server / java client配置

在安裝thrift前需要安裝libevent,用於生成對應的lib連結。 server端 Linux配置 1.下載 從官網http://thrift.apache.org/上下載thrift-0.8.0版本,之前使用的是0.9.3版本,編譯時會報

Linux c 基於記憶體的程序通訊—共享記憶體、共享佇列(訊息佇列)

基於記憶體的程序通訊: 1.      核心共享記憶體 程式設計模型:  1.1.建立共享記憶體,得到一個ID  shmget 1.2.把ID影射成虛擬地址(掛載)  shmat        1.3.使用虛擬地址訪問核心共享記憶體使用任何記憶體函式與運算子號       

Linux C TCPSocket 傳輸檔案簡單例項-多執行緒實現

在Linux下使用C語言TCPSocket實現簡單檔案傳輸,包括客戶端和伺服器端,其中,伺服器端使用多執行緒實現同時接收多個客戶端傳送的檔案。 傳送檔案內容之前,首先需要將檔名和長度資訊傳送到伺服器,為了便於區分,採用傳送結構體的方式,設定標誌位,1標識資料域

Linux作業系統之程序通訊——使用訊息緩衝佇列實現client程序與server程序之間的通訊

使用訊息緩衝佇列來實現client程序和server程序之間的通訊。  問題描述如下: server程序先建立一個關鍵字為SVKEY(如75)的訊息佇列,然後等待接收型別為REQ(如1)的訊息;在收到請求訊息後,它便顯示字串“serving for clien

[C語言] Socket程式設計簡單例子/Client+Server

一、原理=====1.基於TCP協議的伺服器端程式流程:=======1)建立套接字(socket)2)繫結套接字(bind)3)將套接字設為監聽,準備接收客戶請求(listen)4)等待客戶請求的到來,當請求到來後,接受請求,返回一個對應於此次連線的套接字(accept)5)用返回的套接字與客戶端進行通訊(

Linux C UDP Socket實現客戶與伺服器簡單通訊

在linux平臺下用c語言udp協議實現客戶與伺服器的簡單通訊與封裝的實現 一、伺服器端 1、新建CreateServer.c和CreateServer.h檔案,伺服器的建立程式碼在此實現,程式中封裝了建立TcpSocket和UdpSocket伺服器的方法,

C/S通訊互動之Socket篇】Cocos2dx(Client)使用BSD Socket與Mina(Server)手機網遊通訊框架!

其實對於此篇算是對於這段時間網路研究的一個總結。對於手遊網絡通訊的互動,一般情況下,Socket長連線直接使用Mina框架即可,對於Http短連線使用Servlet 入口即可(那麼對於後期將陸續更新Servlet博文)那麼本篇主要介紹Socket長連線,當然與此配對的跨平臺通