欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

基本tcp socket编程

程序员文章站 2022-07-11 08:27:51
...

在linux系统中tcp套接字编程,本例是客户端向服务器发送一条消息,服务器将消息接受后又发送给客户端,是在ubuntu虚拟机上运行的。不说废话了直接上代码。首先是服务器,服务器要先socket(),再初始化结构体,再bind(),再listen()监听客户端的连接,循环accept()接受客户端的连接,处理数据。

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>//sockaddr_in
#include <stdlib.h>
#include <string.h>//strlen
#include <unistd.h>//read ,write
#include <errno.h>
#include <sys/types.h>
int main(int argc,char ** argv){
    int sockfd,connfd,n;//本地套接字连接符号,客户端连接符号,接收数据的长度
    socklen_t len;
    struct sockaddr_in servaddr,cliaddr;//服务器、客户端结构地址
    char buff[100];//接收数据的数组
    if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1){//创建套接字
        printf("socket error"); 
        exit(0);
    }
    bzero(&servaddr,sizeof(servaddr));//初始化套接字
    servaddr.sin_family = AF_INET;//ipv4版本
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);//本机地址
    servaddr.sin_port = htons(4399);//端口号   

    bind(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr));//绑定端口

    listen(sockfd,5);//监听端口,第二个参数写5就好

    while(1){

        len = sizeof(cliaddr);
        if((connfd = accept(sockfd,(struct sockaddr *)NULL,NULL))<0){//接受客户端的连接
            printf("error");
            continue;
        }
        if(!fork()){//这一段是并发服务器的写法,如果使用迭代的话把fork()函数去掉
            n = recv(connfd,buff,100,0);//从客户端接受数据
            send(connfd,buff,n,0);//向客户端发送数据
            close(connfd);//子进程关闭套接字
        }
        buff[n] = '\0';
        printf("recv from cli %s",buff);
        close(connfd);//父进程关闭套接字开始下一轮的处理
    }
    return 0;

然后是客户端,socket(),再初始化结构体,再connet(),再获取键盘读入的数据, send()/write()发送数据,recv()/read()接收数据,下面是代码。

#include <stdio.h>
#include <stdlib.h>// 基本头文件
#include <sys/socket.h>//socket()
#include <netinet/in.h>//struct sockaddr_in
#include <unistd.h>
#include <string.h>//strlen()函数
#include <arpa/inet.h>//inet_pton()函数
#include <errno.h>
int main(int argc,char ** argv){
    int sockfd,conn,n;
    char buff[100],sd[100];//接受和发送数据的数组
    struct sockaddr_in cliaddr;//服务器结构地址
    if(argc!=2){
        printf("ip address");
        exit(0);
    }
    if((sockfd=socket(AF_INET,SOCK_STREAM,0))<0){//创建套接字
        printf("socket error");
        exit(0);
    }
    bzero(&cliaddr,sizeof(cliaddr));//初始化结构地址
    cliaddr.sin_family = AF_INET;//ipv4版本
    cliaddr.sin_port = htons(4399);//端口号
    if(inet_pton(AF_INET,argv[1],&cliaddr.sin_addr)<0){//将从键盘传入的IP参数赋值给&server.sin_addr.s_addr
        printf("error");    
        exit(0);
    }
    if((conn=connect(sockfd,(struct sockaddr *)&cliaddr,sizeof(cliaddr)))<0){//连接服务器
        printf("cerror");
        exit(0);
    }
    fgets(sd,100,stdin);//从键盘读入数据
    if(send(sockfd,sd,strlen(sd),0)<0){//向服务器发送数据
        printf("send error");
        exit(0);
    }
    if((n=recv(sockfd,buff,100,0))<0){//从服务器接受数据
        printf("recv error");
        exit(0);
    }
    buff[n] = '\0';
    printf("%s",buff);
    close(sockfd);
    return 0;
}

运行结果
基本tcp socket编程

相关标签: socket tcp