您的位置:首页 > 理论基础 > 计算机网络

基于socket的TCP和UDP通讯的简单建立

2017-08-12 17:16 375 查看
最近在学习Linux网络编程,写下此学习笔记。

一、建立简单TCP连接的步骤:

服务器端:
1.调用socket()函数定义套接字;
2.调用bind()函数绑定本地地址和端口;
3.调用listen()函数启动监听端;
4.调用accept()函数从已连接队列中提取客户链接,accept为阻塞类型函数,当连接队列为空时,阻塞等待;
5.调用IO函数与客户端通讯;
6.关闭套接字;
客户端:
1.  调用socket()函数创建套接字;
2.  调用connect()函数链接服务器端;
3.  调用IO函数(read/write等)与服务器端进行通讯;
4.  调用close()关闭套接字。


二、建立简单UDP连接的步骤:

服务器端:
1.调用socket()函数定义套接字
2.调用bind()函数绑定本地地址和端口;
3.调用recvfrom()和sendto()函数进行通信;
客户端
1.调用socket()函数创建套接字;
2.调用recvfrom()和sendto()函数进行通信;


/*
* TCP--server
*/
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <linux/in.h>
#include <stdlib.h>
#include <string.h>

int main(int argc,char*argv[]) // 执行时候输入端口号
{
if(argc != 2)
{
printf("too few arg!\n");
exit(1);
}

/* 1.创建套接字 */
int sockfd = socket(AF_INET,SOCK_STREAM,0);
printf("sockfd:%d\n",sockfd);

/* 2.绑定地址 */
struct sockaddr_in srvaddr,cliaddr;
socklen_t len = sizeof(srvaddr);
bzero(&srvaddr,len);

srvaddr.sin_family = AF_INET;
srvaddr.sin_port = htons(atoi(argv[1]));
srvaddr.sin_addr.s_addr = htonl(INADDR_ANY);

bind(sockfd,(struct sockaddr *)&srvaddr,len);

/* 3.监听套接字 */
listen(sockfd,5); // “5”表示最大监听个数为5

char peer[16];
/* 4.等待客户端发起连接,连接成功就返回一个新的文件描述符 */
int connfd = accept(sockfd,(struct sockaddr *)&cliaddr,&len);
if(connfd > 0)
{
printf("new client connect:[%s]\n",
(char *)inet_ntop(AF_INET,&cliaddr.sin_addr,peer,len)
);
}

char buf[100]; // 用于存放读取到的数据

while(1)
{
/* 每次读取前清空缓冲区 */
bzero(buf,100);

/* 阻塞读取数据 */
//read(connfd,buf,sizeof(buf)); 可以直接调用IO函数
recv(connfd,buf,sizeof(buf),0);

printf("from client:%s\n",buf);

/* 如果客户端发出“quit”则退出 */
if(strncmp(buf,"quit",4) == 0)
break;

}
/* 通讯完毕,关闭套接字 */
close(connfd);
close(sockfd);

return 0;
}


/*
* TCP---client
*/

#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <linux/in.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char const *argv[])
{
if (argc != 3)
{
fprintf(stderr, " too few arg for %s\n", argv[0]);
exit(1);
}

/* 1.创建套接字 */
int sockfd = socket (AF_INET, SOCK_STREAM, 0);
printf("sockfd : %d\n", sockfd);

/* 设置服务器ip与端口号 */
struct sockaddr_in seraddr;

seraddr.sin_family = AF_INET;
seraddr.sin_port = htons(atoi(argv[2]));
inet_pton(AF_INET, argv[1], &seraddr.sin_addr);

/* 发送连接请求 */
int ret = connect(sockfd, (struct sockaddr *)&seraddr, sizeof(seraddr));
if (ret == -1)
{
fprintf(stderr, "connect error!\n" );
exit(1);
}

/* 发送消息 */
char buf[100];  //用于存储发送的数据
while(1)
{
bzero(buf, 100);
fgets(buf, 100, stdin);
send(sockfd, buf, strlen(buf),0);
if (strncmp(buf, "quit", 4) == 0)
break;
}

/* 通讯结束,关闭套接字 */
close(sockfd);
return 0;
}


/*
* UDP -----server
*/
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <linux/in.h>
#include <stdlib.h>
#include <string.h>

int main(int argc,char *argv[]) //  执行时需要指定端口号
{
/* 1.创建套接字 */
int sockfd = socket(AF_INET,SOCK_DGRAM,0);

/* 2.绑定服务器地址 */
struct sockaddr_in srvaddr;

srvaddr.sin_family = AF_INET;
srvaddr.sin_port = htons(atoi(argv[1]));
srvaddr.sin_addr.s_addr = htonl(INADDR_ANY);

bind(sockfd,(struct sockaddr *)&srvaddr,sizeof(srvaddr));

/* 3.调用IO函数进行通讯 */
char buf[100];
struct sockaddr_in cliaddr;
socklen_t len = sizeof(cliaddr);

while(1)
{
bzero(buf,100);
bzero(&cliaddr,len);

recvfrom(sockfd,buf,sizeof(buf),0,(struct sockaddr *)&cliaddr,&len);

printf("from client:%s",buf);

if(strncmp(buf,"quit",4) == 0)
break;
}

/* 4.关闭套接字文件 */
close(sockfd);
}


/*
* UDP----client
*/
/* UDP客户端 */

#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <linux/in.h>
#include <stdlib.h>
#include <string.h>

int main(int argc,char *argv[]) // ./Jack 192.168.1.3 50001
{
/* 1.创建套接字 */
int sockfd = socket(AF_INET,SOCK_DGRAM,0);

/* 2.设置服务器的IP与端口号 */
struct sockaddr_in srvaddr;

srvaddr.sin_family = AF_INET;
srvaddr.sin_port = htons(atoi(argv[2]));
inet_pton(AF_INET,argv[1],&srvaddr.sin_addr);

/* 调用IO函数进行通讯 */
char buf[100];
while(1)
{
bzero(buf,100);

fgets(buf,100,stdin);

sendto(sockfd,buf,strlen(buf),0,(struct sockaddr *)&srvaddr,sizeof(srvaddr));

if(strncmp(buf,"quit",4) == 0)
break;
}

/* 4.关闭套接字 */
close(sockfd);

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  socket 网络编程