linux socket编程:简易客户端与服务端

什么是socket?

socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模式来操作。其实socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭)

socket的作用是用于网络通讯,网络通讯一般指的是不同主机之间的进程通讯,比如我电脑上的qq和你电脑上的qq实现通讯,都是进程之间发送数据.

在本地用pid标识一个进程,在网络中,tcp/ip协议的网络层“ip地址”可以唯一标识网络中的主机,传输层的“协议+端口”可以唯一标识主机中的应用程序(进程)。(ip地址,协议,端口)就可以标识网络的进程了,网络中的进程通信就可以利用这个标志与其它进程进行交互

socket服务端编程基本步骤:

1,创建套接字, 利用socket函数

2,绑定套接字: bind

3,监听套件字: listen

4,accept,接收客户端的连接,3次握手就发生在这个阶段,  这个函数返回一个新的套接字

5,处理业务

socket客户端:

1,创建套接字: socket

2,连接服务端: connect

3,处理业务

----------------------------------------------------------------------------------------------------------------------------------

服务端源码:

 1 #include <stdio.h>
 2 #include <sys/types.h>
 3 #include <sys/socket.h>
 4 #include <stdlib.h>
 5 #include <string.h>
 6 #include <arpa/inet.h>
 7 #include <unistd.h>
 8
 9 int main(int argc, char *argv[])
10 {
11     int sockfd = -1;
12     int bindres = -1;
13     int listenres = -1;
14
15     sockfd = socket( AF_INET, SOCK_STREAM, 0 );
16     if ( -1 == sockfd ) {
17         perror( "sock created" );
18         exit( -1 );
19     }
20
21     struct sockaddr_in server;
22     memset( &server, 0, sizeof( struct sockaddr_in ) );
23     server.sin_family = AF_INET;
24     server.sin_port = 6666;
25     server.sin_addr.s_addr = htonl( INADDR_ANY );
26
27     bindres = bind( sockfd, (struct sockaddr*)&server, sizeof( server ) );
28     if( -1 == bindres ) {
29         perror( "sock bind" );
30         exit( -1 );
31     }
32
33     listenres = listen( sockfd, SOMAXCONN );
34     if( -1 == listenres ) {
35         perror( "sock listen" );
36         exit( -1 );
37     }
38
39     struct sockaddr_in peerServer;
40     int acceptfd = -1;
41     socklen_t len = sizeof( peerServer );
42     acceptfd = accept( sockfd, (struct sockaddr*)&peerServer, &len );
43     if ( -1 == acceptfd ) {
44         perror( "sock accept" );
45         exit( -1 );
46     }
47
48     char recvBuf[1024];
49     while( 1 ) {
50         memset( recvBuf, 0, sizeof( recvBuf ) );
51         int recvBytes = read( acceptfd, recvBuf, sizeof( recvBuf ) );
52         fputs( recvBuf, stdout );
53         write( acceptfd,recvBuf, recvBytes );
54     }
55
56     close( sockfd );
57     close( acceptfd );
58
59     return 0;
60 }

客户端源码:

 1 #include <stdio.h>
 2 #include <sys/types.h>
 3 #include <sys/socket.h>
 4 #include <stdlib.h>
 5 #include <string.h>
 6 #include <arpa/inet.h>
 7 #include <unistd.h>
 8
 9 int main(int argc, char *argv[])
10 {
11     int sockfd = -1;
12
13     sockfd = socket( AF_INET, SOCK_STREAM, 0 );
14     if ( -1 == sockfd ) {
15         perror( "sock created" );
16         exit( -1 );
17     }
18
19     struct sockaddr_in server;
20     memset( &server, 0, sizeof( struct sockaddr_in ) );
21     server.sin_family = AF_INET;
22     server.sin_port = 6666;
23     server.sin_addr.s_addr = inet_addr( "127.0.0.1" );
24
25     int res = -1;
26     res = connect( sockfd, (struct sockaddr*)&server, sizeof( server ) );
27     if( -1 == res ){
28         perror( "sock connect" );
29         exit( -1 );
30     }
31
32     char sendBuf[1024] = { 0 };
33     char recvBuf[1024] = { 0 };
34     while( fgets( sendBuf, sizeof( sendBuf ), stdin ) != NULL ) {
35         write( sockfd, sendBuf, sizeof( sendBuf ) );
36         read( sockfd, recvBuf, sizeof( recvBuf ) );
37         fputs( recvBuf, stdout );
38         memset( sendBuf, 0, sizeof( sendBuf ) );
39         memset( recvBuf, 0, sizeof( recvBuf ) );
40     }
41
42     close( sockfd );
43
44     return 0;
45 }

备注:

1、socket函数的参数:当protocol为0时,会自动选择type类型对应的默认协议

2、将sin_addr设置为INADDR_ANY"的含义是什么?

转换过来就是0.0.0.0,泛指本机的意思,也就是表示本机的所有IP,因为有些机子不止一块网卡,多网卡的情况下,这个就表示所有网卡ip地址的意思。 比如一台电脑有3块网卡,分别连接三个网络,那么这台电脑就有3个ip地址了,如果某个应用程序需要监听某个端口,那他要监听哪个网卡地址的端口呢? 如果绑定某个具体的ip地址,你只能监听你所设置的ip地址所在的网卡的端口,其它两块网卡无法监听端口,如果我需要三个网卡都监听,那就需要绑定3个ip,也就等于需要管理3个套接字进行数据交换,这样岂不是很繁琐? 所以出现INADDR_ANY,你只需绑定INADDR_ANY,管理一个套接字就行,不管数据是从哪个网卡过来的,只要是绑定的端口号过来的数据,都可以接收到

原文地址:https://www.cnblogs.com/ghostwu/p/8242052.html

时间: 2024-10-10 23:55:13

linux socket编程:简易客户端与服务端的相关文章

python socket编程之客户端和服务端简单交互

服务端 #_*_ coding:utf-8 _*_ #导入socket模块 import socket # 创建socket对象 sk = socket.socket() #绑定侦听的IP和端口号 ip_port = ('192.168.9.213',9999) sk.bind(ip_port) #最大连接数 sk.listen(5) #接受请求,接受请求的时候可以获取到客户端的socket对象,以及客户端的IP和端口 #通过while循环,让服务端一直接受客户端请求 print "正在等待客户

socket编程,简单多线程服务端测试程序

socket编程,简单多线程服务端测试程序 前些天重温了MSDN关于socket编程的WSAStartup.WSACleanup.socket.closesocket.bind.listen.accept.recv.send等函数的介绍,今天写了一个CUI界面的测试程序(依赖MFC)作为补充.程序功能简介如下: 1:一个线程做监听用. 2:监听线程收到客户端连接后,创建新线程接收客户端数据.所有对客户端线程将加入容器,以便管理. 3:服务端打印所有客户端发来的信息. 4:服务端CUI界面输入数字

linux网络编程之用socket实现简单客户端和服务端的通信(基于UDP)

单客户端和服务端的通信(基于UDP)   代码 服务端代码socket3.c #include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> #include<arpa/inet.h> #include<unistd.h> #include<stdlib.h> #include<stdio.h> #include<string.h> #in

网络编程(浏览器客户端-自定义服务端)

1 package netTest; 2 /* 3 * 演示客户端和服务端 4 * 1 客户端:浏览器 5 * 服务端:自定义 6 * tomcat 服务器所作的事情:用printwriter out 把网页数据全打到客户端去, 7 * 而浏览器可以解析 数据. 8 * telnet 远程登录:windows 提供的远程登录的工具,它可以去连接网络中的任意一台主机(dos命令行下连接) 9 * 可以对主机进行命令式的配置.(客户端软件) 10 */ 11 import java.net.*; 1

java Socket通信,客户端与服务端相互发消息

1.通信过程 网络分为应用层,http.ssh.telnet就是属于这一类,建立在传输层的基础上.其实就是定义了各自的编码解码格式,分层如下: 2.Socket连接 上述通信都要先在传输层有建立连接的基础上才能完成,TCP通过三次握手建立连接:   Socket与http的区别可以看下这个: https://www.cnblogs.com/meier1205/p/5971313.html 还有搜索:http下午茶 3.JAVA socket 客户端与服务端互发消息 实现结构图:   客户端和服务

Socket编程实践(6) --TCP服务端注意事项

僵尸进程处理 1)通过忽略SIGCHLD信号,避免僵尸进程 在server端代码中添加 signal(SIGCHLD, SIG_IGN); 2)通过wait/waitpid方法,解决僵尸进程 signal(SIGCHLD,onSignalCatch); void onSignalCatch(int signalNumber) { wait(NULL); } 3) 如果多个客户端同时关闭, 问题描述如下面两幅图所示: /** client端实现的测试代码**/ int main() { int s

TCP Socket 通讯(客户端与服务端)

/*----------------------------编译环境:VS2015---------------------------------------*/ /*-----------------------------Author:刘收获-------------------------------------------*/ //Sever端口 // ConsoleApplication1.cpp : 定义控制台应用程序的入口点.// #include "stdafx.h"

linux 安装php时不安装mysql客户端或者服务端

php5.3以上就不要安装mysql 客户端,就可以使php支持mysql截取官网  “对于 php-5.3.0或更新版本,mysqli 默认使用Mysql Native Driver作为驱动. 这个驱动比libmysql会有一些优势, --with-mysql=mysqlnd  需要在./configure 时添加  --with-mysql=mysqlnd这个映射. ./configure --prefix=/usr/local/php --with-apxs2=/usr/local/apa

需求: 客户端与服务端一问一答聊天。

import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.InetAddress; import java.net.Socket; /* 需求: 客户端与服务端一问一答聊天. 1.如果使用BuffrerdReader的readline方法一定要加上\r\n才把数据写出.