设为首页 加入收藏

TOP

Linux下TCP网络编程与基于Windows下C#Socket编程间通信(一)
2015-07-16 12:56:53 来源: 作者: 【 】 浏览:8
Tags:Linux TCP 网络编程 基于 Windows C#Socket 编程 通信

一、Linux下TCP网络编程基础,需要了解相关函数


Socket():用于套接字初始化。
Bind():将 socket 与本机上的一个端口绑定,就可以在该端口监听服务请求。
Listen():使socket处于被动的监听模式,并为该? socket? 建立一个输入数据队列,将到达的服务器, 请求保存在此队列中,直到程序处理他们。
Accept():让服务器接收客户的连接请求。
Connect():客户端使用connect函数来配置 socket并与远端服务器建立一个 TCP 连接。
Close():关闭socket
Send():发送函数
Recv():接受函数


二、服务器和客户端流程图如下图所示



三、Linux下TCP编程实例


TCP服务器程序


/* server.c */
#include
#include
#include
#include
#include
#include
#include
#include
#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
#include
#include
#include
#include
#include
#include
#include
#include
#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=re

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C++在循环内和循环外定义变量的差.. 下一篇Lua解析赋值类型代码的过程

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: