歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Linux下TCP網絡編程與基於Windows下C#Socket編程間通信

Linux下TCP網絡編程與基於Windows下C#Socket編程間通信

日期:2017/3/1 9:29:34   编辑:Linux編程

一、Linux下TCP網絡編程基礎,需要了解相關函數

Socket():用於套接字初始化。
Bind():將 socket 與本機上的一個端口綁定,就可以在該端口監聽服務請求。
Listen():使socket處於被動的監聽模式,並為該 socket 建立一個輸入數據隊列,將到達的服務器, 請求保存在此隊列中,直到程序處理他們。
Accept():讓服務器接收客戶的連接請求。
Connect():客戶端使用connect函數來配置 socket並與遠端服務器建立一個 TCP 連接。
Close():關閉socket
Send():發送函數
Recv():接受函數

二、服務器和客戶端流程圖如下圖所示

三、Linux下TCP編程實例

TCP服務器程序

/* server.c */
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define PORT 2000 //定義端口號
#define BUFFER_SIZE 1024
#define MAX_QUE_CONN_NM 5 //最大緩沖隊列
int main(void)
{

/*下面該以太網套接字地址結構體非常重要*/
struct sockaddr_in server_addr,client_addr;
int sin_size,recvbytes,wbytes;
int ser_fd,cli_fd;
char buf[BUFFER_SIZE];
/* 建立 socket 連接,IPv4 協議,字節流套接字 */
if((ser_fd = socket(AF_INET,SOCK_STREAM,0))== -1)
{
perror("socket");
exit(1);
}
printf("Socket id = %d\n",ser_fd);
/* 初始化 sockaddr_in 結構體 */
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(PORT);
server_addr.sin_addr.s_addr = INADDR_ANY;
bzero(&(server_addr.sin_zero),8);
/* 綁定函數 bind */
if(bind(ser_fd,(struct sockaddr *)&server_addr,sizeof(struct
sockaddr))==-1)
{
perror("bind");
exit(1);
}
printf("Bind success!\n");

/* 調用 listen 函數,進行監聽 */
if(listen(ser_fd,MAX_QUE_CONN_NM)== - 1)
{
perror("listen");
exit(1);
}
printf("Listening......\n");

/* 調用 accept 函數,等待客戶端的連接 */
if((cli_fd = accept(ser_fd,(struct sockaddr *)&client_addr,&sin_size))==-1)
{
perror("accept");
exit(1);
}
printf("Have client ready for connecting\n");

/* 調用 recv 函數接收客戶端的請求 */
memset(buf,0,sizeof(buf));
if((recvbytes = recv(cli_fd,buf,BUFFER_SIZE,0))== -1)
{
perror("recv");
exit(1);
}
/* 將收到的信息(客服端發來的信息)打印出來 */
printf("Received a message:%s\n",buf);
/*對客戶端發過來的數據進行處理,只是將首字符加2,再發給客戶端*/
buf[0]=buf[0]+2;
if( ( wbytes = write(cli_fd,buf,strlen(buf)) ) == -1 )
{
perror("handle send");
exit(1);
}
else
printf("handle buf is %s\n",buf);
/* 關閉 socket */
close(ser_fd);
return 0;
}

TCP客端程序

/*client*/
#include<sys/types.h>
#include<sys/socket.h>
#include<sys/ioctl.h>
#include<netinet/in.h>
#include<netdb.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#define PORT 2000 //端口號
#define BUFFER_SIZE 1024
int main(int argc,char *argv[])
{
struct sockaddr_in server_addr;
int sockfd,sendbytes,rbytes;
//int ser_fd;
char buf[BUFFER_SIZE];
struct hostent *host;
/*指定輸入參數為3個,否則出錯*/
if(argc!=3)
{
perror("Usage:./clinet IP address Text\n");
exit(1);
}
/*地址解析函數*/
if( ( host = gethostbyname(argv[1]) ) == NULL ) //得到主機名及相應信息
{
perror("gethostbyname");
exit(1);
}
memset(buf,0,sizeof(buf));
sprintf(buf,"%s",argv[2]);
buf[strlen(buf)+1]='\0';
/*建立socket連接,IPv4協議,字節流套接字*/

if( ( sockfd = socket(AF_INET,SOCK_STREAM,0) ) == -1 )
{
perror("socket");
exit(1);
}
printf("Socket id = %d\n",sockfd);

/*初始化sockaddr_in 結構體*/
server_addr.sin_family = AF_INET; //TCP/IP協議簇
server_addr.sin_port = htons(PORT); // sin_port存儲端口號(使用網絡字節順序) htons將unsigned short從主機字節序轉化為網絡字節序
server_addr.sin_addr = *((struct in_addr *)host->h_addr); //前面指過的,host主機名及相應信息的指針,這裡為IP地址
bzero(&(server_addr.sin_zero),8); //等同於memset,清空作用
/*調用connect函數主動發起對服務器的連接*/
if( ( connect(sockfd,(struct sockaddr *)&server_addr,sizeof(struct sockaddr)) ) == -1 ) //第2個參數,指向要連接套接字的sockaddr結構體的指針
{
perror("connect");
exit(1);
}
printf("connect server success!\n");
/*發送消息給服務器端*/
if( ( sendbytes = send(sockfd,buf,strlen(buf),0) ) == -1 )
{
perror("send");
exit(1);
}
else printf("buf is %s\n",buf);
/* 將服務器處理後的數據讀取出來 */
if ((rbytes=read(sockfd,buf,100))==-1)
{
printf("read handle error\n");
exit(0);
}
else
printf("read handle buf is %s \n",buf);
close(sockfd);
return 0;
}

四、程序運行結果如下:

客戶端結果

服務器結果

五、C#socket()編程

參考資料:

http://www.linuxidc.com/Linux/2015-02/112757.htm

對該資料進行了些修改生成exe文件

運行結果如下

C#TCP客戶端

C#TCP服務器

六、由於linux下和C#下都使用了TCP網絡編程,所以用linux當作客戶端,C#當作服務器,設置好端口號和IP地址,

他們之間是可以通信的,然後在C#下可以把相關的數據寫入數據庫裡面,相關網頁再從數據庫裡面讀取相關數據就行了。

運行結果如下

Linux客戶端

C#服務器

七、總結心得

Linux下的網絡編程和Windows下C#網絡編程都是使用TCP協議進行通信,所以即使是跨平台,他們之間還是能進行通信的。

Copyright © Linux教程網 All Rights Reserved