linux网络编程实例

获取服务器时间

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

#define HOSTNAMELEN 40
#define BUFLEN 1024
#define PORT 13

int main(int argc, char *argv[])
{
        int rc;
        int sockfd;
        char buf[BUFLEN+1];
        char *pc;
        struct sockaddr_in sa;
        struct hostent *hen;
        if (argc < 2) {
                fprintf(stderr, "missing host name\n");
                exit(1);
        }
        hen = gethostbyname(argv[1]);
        if (!hen) {
                perror("could not resolve host name");
                exit(1);
        }
        memset(&sa, 0, sizeof(sa));
        sa.sin_family = AF_INET;
        sa.sin_port = htons(PORT);
        memcpy(&sa.sin_addr.s_addr, hen->h_addr_list[0], hen->h_length);
        sockfd = socket(AF_INET, SOCK_STREAM, 0);
        if (sockfd < 0) {
                perror("socket()");
                exit(1);
        }
        rc = connect(sockfd, (struct sockaddr*)&sa, sizeof(sa));
        if (rc < 0) {
                perror("connect()");
                exit(1);
        }
        pc = buf;
        while (rc = read(sockfd, pc, BUFLEN - (pc-buf))) {
                pc += rc;
        }
        close(sockfd);
        *pc = ‘\0‘;
        printf("time: %s\n", buf);
        return 0;
}

tcp服务器端

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

#define PORT 8888
#define BACKLOG 1

int main()
{
        int listenfd, connfd;
        struct sockaddr_in servaddr;
        struct sockaddr_in cliaddr;
        int sin_size;
        //socket
        if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
                perror("socket()");
                exit(1);
        }
        //set socket can be reuse
        int opt = SO_REUSEADDR;
        setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
        //bind
        memset(&servaddr, 0, sizeof(servaddr));
        servaddr.sin_family = AF_INET;
        servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
        servaddr.sin_port = htons(PORT);
        if (bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1)
 {
                perror("bind()");
                exit(1);
        }
        //listen
        if (listen(listenfd, BACKLOG) == -1) {
                perror("listen()");
                exit(1);
        }
        //accept
        sin_size = sizeof(cliaddr);
        if ((connfd = accept(listenfd, (struct sockaddr*)&cliaddr, &sin_size)) =
= -1) {
                perror("accept()");
                exit(1);
        }
        //print client ip
        printf("get a connection from %s\n", inet_ntoa(cliaddr.sin_addr));
        //send
        char *msg = "welcome to server";
        send(connfd, msg, strlen(msg), 0);
        //close
        close(connfd);
        close(listenfd);

        return 0;
}

tcp客户端

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

#define PORT 8888
#define MAXDATASIZE 100

int main(int argc, char *argv[])
{
        int fd, numbytes;
        char buf[MAXDATASIZE];
        struct hostent *he;
        struct sockaddr_in servaddr;
        if (argc != 2) {
                printf("usage: %s <ip>\n", argv[0]);
                exit(1);
        }
        if ((he = gethostbyname(argv[1])) == NULL) {
                perror("gethostbyname()");
                exit(1);
        }
        if ((fd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
                perror("socket()");
                exit(1);
        }
        bzero(&servaddr, sizeof(servaddr));
        servaddr.sin_family = AF_INET;
        servaddr.sin_port = htons(PORT);
        servaddr.sin_addr = *((struct in_addr *)he->h_addr);
        if (connect(fd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1) {
                perror("connect()");
                exit(1);
        }
        if ((numbytes = recv(fd, buf, MAXDATASIZE, 0)) == -1) {
                perror("recv()");
                exit(1);
        }
        buf[numbytes] = 0;
        printf("server message: %s\n", buf);
        close(fd);
        return 0;
}

udp服务器端

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define PORT 8888
#define LINESIZE 100
int main()
{
        int sockfd;
        struct sockaddr_in servaddr;
        struct sockaddr_in cliaddr;
        int sin_size;
        int num;
        char msg[LINESIZE];
        if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
                perror("socket()");
                exit(1);
        }
        memset(&servaddr, 0, sizeof(servaddr));
        servaddr.sin_family = AF_INET;
        servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
        servaddr.sin_port = htons(PORT);
        if (bind(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1) {

                perror("bind()");
                exit(1);
        }
        sin_size = sizeof(cliaddr);
        while (1) {
                num = recvfrom(sockfd, msg, LINESIZE, 0,
                                (struct sockaddr*)&cliaddr, &sin_size);
                if (num < 0) {
                        perror("recvfrom()");
                        exit(1);
                }
                msg[num] = 0;
                printf("you got a message (%s) from %s\n", msg,
                                inet_ntoa(cliaddr.sin_addr));
                char *msg1 = "welcome to server.";
                sendto(sockfd, msg1, strlen(msg1), 0,
                                (struct sockaddr*)&cliaddr, sin_size);
                if (!strcmp(msg, "quit"))
                        break;
        }
        close(sockfd);
        return 0;
}

udp客户端

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#define PORT 8888
#define LINESIZE 100
int main(int argc, char *argv[])
{
        int fd, numbytes;
        char buf[LINESIZE];
        struct hostent *he;
        struct sockaddr_in servaddr, reply;
        if (argc != 3) {
                printf("usage: %s <ip> <message>\n", argv[0]);
                exit(1);
        }
        if ((he = gethostbyname(argv[1])) == NULL) {
                perror("gethostbyname()");
                exit(1);
        }
        if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
                perror("socket()");
                exit(1);
        }
        bzero(&servaddr, sizeof(servaddr));
        servaddr.sin_family = AF_INET;
        servaddr.sin_port = htons(PORT);
        servaddr.sin_addr = *((struct in_addr*)he->h_addr);
        sendto(fd, argv[2], strlen(argv[2]), 0,
                        (struct sockaddr*)&servaddr, sizeof(servaddr));
        while (1) {
                int len;
                if ((numbytes = recvfrom(fd, buf, LINESIZE, 0,
                                                (struct sockaddr*)&reply, &len))
 == -1) {
                        perror("recvfrom()");
                        exit(1);
                }
                if (len != sizeof(reply)
                                || memcmp((const void*)&servaddr, (const void*)&
reply, len) != 0) {
                        printf("receive message from other server.\n");
                        continue;
                }
                buf[numbytes] = 0;
                printf("server message: %s\n", buf);
                break;
        }
        close(fd);
        return 0;
}

时间: 2024-10-24 19:00:49

linux网络编程实例的相关文章

Linux网络编程——原始套接字实例:简单版网络数据分析器

通过<Linux网络编程--原始套接字编程>得知,我们可以通过原始套接字以及 recvfrom( ) 可以获取链路层的数据包,那我们接收的链路层数据包到底长什么样的呢? 链路层封包格式 MAC 头部(有线局域网) 注意:CRC.PAD 在组包时可以忽略 链路层数据包的其中一种情况: unsigned char msg[1024] = { //--------------组MAC--------14------ 0xb8, 0x88, 0xe3, 0xe1, 0x10, 0xe6, // dst

Linux网络编程——原始套接字实例:MAC 头部报文分析

通过<Linux网络编程——原始套接字编程>得知,我们可以通过原始套接字以及 recvfrom( ) 可以获取链路层的数据包,那我们接收的链路层数据包到底长什么样的呢? 链路层封包格式 MAC 头部(有线局域网) 注意:CRC.PAD 在组包时可以忽略 链路层数据包的其中一种情况: 1 unsigned char msg[1024] = { 2 //--------------组MAC--------14------ 3 0xb8, 0x88, 0xe3, 0xe1, 0x10, 0xe6,

Linux网络编程socket选项之SO_LINGER,SO_REUSEADDR

from http://blog.csdn.net/feiyinzilgd/article/details/5894300 Linux网络编程中,socket的选项很多.其中几个比较重要的选项有:SO_LINGER(仅仅适用于TCP,SCTP), SO_REUSEADDR. SO_LINGER 在默认情况下,当调用close关闭socke的使用,close会立即返回,但是,如果send buffer中还有数据,系统会试着先把send buffer中的数据发送出去,然后close才返回. SO_L

很全的linux网络编程技巧

注:作者王晓,本人认为总结得很好,故记之,绝无侵权之意. 1. LINUX网络编程基础知识 1 1.1. TCP/IP协议概述 1 1.2. OSI参考模型及TCP/IP参考模型 1 1.3. TCP协议 3 1.4. UDP协议 5 1.5. 协议的选择 6 2. 网络相关概念 6 2.1. socket概念 7 2.2. socket类型 8 2.3. socket信息数据结构 8 2.4. 数据存储优先顺序的转换 8 2.5. 地址格式转化 9 2.6. 名字地址转化 10 3. sock

Linux网络编程入门 (转载)

http://www.cnblogs.com/RascallySnake/archive/2012/01/04/2312564.html (一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端         网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户端        在网络程序中,如果一个程序主动和外面的程序通信,那么我们把这个程序称为客户端程序. 比如我们使用ftp程序从另外一        个地方获取文件

Linux网络编程--多播

一.多播介绍 什么是多播? 单播用于两个主机之间的端对端通信,广播用于一个主机对整个局域网上所有主机上的数据通信.单播和广播是两个极端,要么对一个主机进行通信,要么对整个局域网上的主机进行通信.实际情况下,经常需要对一组特定的主机进行通信,而不是整个局域网上的所有主机,这就是多播的用途.多播,也称为"组播",将局域网中同一业务类型主机进行了逻辑上的分组,进行数据收发的时候其数据仅仅在同一分组中进行,其他的主机没有加入此分组不能收发对应的数据. 多播的地址是特定的,D类地址用于多播.D类

Linux网络编程:客户端/服务器的简单实现

一. Socket的基本知识 1. socket功能 Socket层次 Socket实质上提供了进程通信的端点,进程通信之前,双方必须首先各自创建一个端点,否则是没有办法建立联系并相互通信的. 每一个Socket都一个半相关描述: {协议, 本地地址, 本地端口} 完整的Socket的描述: {协议, 本地地址, 本地端口, 远程地址, 远程端口} 2. Socket工作流程 面向连接(TCP)的Socket工作流程 UDP的socket工作流程 l 服务器端 首先,服务器应用程序用系统调用so

嵌入式 Linux网络编程(一)——Socket网络编程基础

嵌入式 Linux网络编程一--Socket网络编程基础 一.Socket简介 1.网络中进程间通信 本机进程使用进程号区别不同的进程进程间通信方式有管道.信号.消息队列.共享内存.信号量等.网络中进程间的通信首先需要识别进程所在主机在网络中的唯一标识即网络层的IP地址主机上的进程可以通过传输层的协议与端口号识别. 2.Socket原理 Socket是应用层与TCP/IP协议族通信的中间软件抽象层是一种编程接口.Socket屏蔽了不同网络协议的差异支持面向连接(Transmission Cont

嵌入式 Linux网络编程(二)——TCP编程模型

嵌入式 Linux网络编程(二)--TCP编程模型 一.TCP编程模型 TCP编程的一般模型如下图: TCP编程模型分为客户端和服务器端编程,两者编程流程如下: TCP服务器端编程流程: A.创建套接字: B.绑定套接字: C.设置套接字为监听模式,进入被动接受连接状态: D.接受请求,建立连接: E.读写数据: F.终止连接. TCP客户端编程流程: A.创建套接字: B.与远程服务器建立连接: C.读写数据: D.终止连接. 二.TCP迭代服务器编程模型 TCP循环服务器接受一个客户端的连接