深入理解 Linux 下 C 语言 TCP Connect 编程技巧 (linux c tcp connect)

随着互联网技术的发展,TCP/IP协议已经成为网络通信中最基本的协议之一。在各种操作系统中,Linux下用C语言编写TCP程序是很常见的,其性能和效率也是其他语言所无法比拟的。下面我们来深入探讨一下Linux下C语言TCP Connect编程的一些技巧。

一、TCP Connect 函数调用流程

在Linux下,TCP Connect连接需要通过socket连接函数来完成。其调用流程如下图所示:

![TCP Connect 函数调用流程](https://img-blog.csdn.net/20230420232838574)

从图中我们可以看到,TCP Connect连接涉及了socket、bind、connect几个函数。这些函数的含义和调用方法我们在这里不做过多阐述,读者可以参考相关的资料进行学习和掌握。

二、TCP Connect 的返回值含义

在实际编程中,我们经常需要对TCP Connect函数的返回值进行判断,以判断连接是否成功建立。TCP Connect函数的返回值有以下两种情况:

1. 返回0

如果TCP Connect函数返回0,则表示连接建立成功。

2. 返回-1

如果TCP Connect函数返回-1,则表示连接建立失败。此时我们需要通过errno变量获取具体的错误信息,进一步确定问题所在。errno是一个特殊的全局变量,用于存储最近一次出现的系统错误编号。我们可以通过perror函数打印出来,帮助我们进行调试和排错。errno的取值列表可以参考Linux系统手册或相关参考资料。

三、TCP Connect 函数常见问题及解决方法

在TCP Connect编程中,常见的问题有以下几种:

1. 连接失败,返回“Connection refused”(拒绝连接)错误

出现这种错误的原因一般是目标主机不存在或者是目标主机的TCP服务没有开启。可以通过以下方法进行排查:

(1)检查目标主机的IP地址是否正确

(2)检查目标主机的网络链接是否正常

(3)检查目标主机是否运行了相关的TCP服务

2. 连接失败,返回“Connection timed out”(连接超时)错误

出现这种错误的原因一般是在TCP Connect函数调用时,目标主机没有响应,导致连接无法建立。可以通过以下方法进行排查:

(1)检查目标主机是否处于正常运行状态

(2)检查目标主机上的防火墙配置是否正常,是否会阻止入站连接

(3)检查连接对方的端口是否存在,或者该端口是否开启了防火墙

3. 连接失败,返回“Invalid argument”(无效参数)错误

出现这种错误的原因一般是TCP Connect函数的参数错误,例如socket描述符不合法等。可以通过以下方法进行排查:

(1)检查socket描述符是否为空或不合法

(2)检查地址族(AF_INET等)参数是否正确

(3)检查连接对方的端口号是否正确

以上是TCP Connect编程中常见的问题及其解决方法,当然还有其他具体问题需要具体分析。在实际编程中,我们需要不断地积累经验,不断进行实践,才能更好地掌握TCP编程技巧。

四、TCP Connect 编程实例

下面我们来看一个TCP Connect编程的实例,以便更好地理解和掌握TCP编程技巧。

“`

#include

#include

#include

#include

#include

#include

#define MAX_LINE 4096

int mn(int argc, char **argv) {

int sockfd;

struct sockaddr_in servaddr;

char sendline[MAX_LINE], recvline[MAX_LINE];

if (argc != 2) {

printf(“Usage: %s \n”, argv[0]);

exit(1);

}

if ((sockfd = socket(AF_INET, SOCK_STREAM, 0))

perror(“socket error”);

exit(1);

}

memset(&servaddr, 0, sizeof(servaddr));

servaddr.sin_family = AF_INET;

servaddr.sin_port = htons(13);

if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr)

printf(“inet_pton error for %s\n”, argv[1]);

exit(1);

}

if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr))

perror(“connect error”);

exit(1);

}

printf(“Before write to server.\n”);

sprintf(sendline, “Hello, %s! This is a test message.\n”, argv[1]);

write(sockfd, sendline, strlen(sendline));

printf(“After write to server.\n”);

memset(recvline, 0, MAX_LINE);

if (read(sockfd, recvline, MAX_LINE)

perror(“read error”);

exit(1);

}

printf(“%s”, recvline);

close(sockfd);

exit(0);

}

“`

相关问题拓展阅读:

如何在linux下用tcp传输文件

一. FTP 说明linux 系统下常用的FTP 是vsftp, 即Very Security File Transfer Protocol. 还有一个是proftp(Profession ftp)。 我们这里也是简单的说明下vsftp的配置。 vsftp提供3种远程的登录方式: (1)匿名登录方式 就是不需要用户名,密码。就能登录到服务器电脑里面(2)本地用户方式 需要帐户名和密码才能登录。而且,这个帐户名和密码,都是在你linux系统里面,已经有的用户。 (3)虚拟用户方式同样需要用户名和密码才能登录。但是和上面的区别就是,这个用户名和密码,在你linux系统中是没有的(没有该用户帐号)二. Vsftp的安装配置2.1 安装vsftp 的安装包,可以在安装里找到。 用yum 安装过程也很简单。安装命令:yum install vsftpd2.2. 相关命令2.2.1 启动与关闭# service vsftpd startStarting vsftpd for vsftpd: # service vsftpd stopShutting down vsftpd:# service vsftpd restartShutting down vsftpd:Starting vsftpd for vsftpd: # /etc/init.d/vsftpd startStarting vsftpd for vsftpd: # /etc/init.d/vsftpd stopShutting down vsftpd:# /etc/init.d/vsftpd restartShutting down vsftpd:Starting vsftpd for vsftpd: # /etc/init.d/vsftpd statusvsftpd (pid 3931) is running…#2.2.2. 其他命令–查看vsftpd 启动状态# chkconfig –list vsftpdvsftpd:off 1:off 2:off 3:off 4:off 5:off 6:off# chkconfig vsftpd on# chkconfig –list vsftpdvsftpd:off 1:off 2:on 3:on 4:on 5:on 6:off这里看到,默认情况下从2到5设置为on了。2到5是多用户级别。 这个对应的是linux不同的运行级别。我们也可以加level 选项来指定:# chkconfig –level 0 vsftpd on # chkconfig –list vsftpdvsftpd:on 1:off 2:on 3:on 4:on 5:on 6:off我们看到0已经设置为on了。我们可以使用man chkconfig 来查看帮助:–level levels Specifies the run levels an operation should pertain to. It is given as a string of numbers from 0 to 7. For example, –level 35 specifies runlevels and 5.传统的init 定义了7个运行级(run level),每一个级别都代表系统应该补充运行的某些特定服务: (1)0级是完全关闭系统的级别 (2)1级或者S级代表单用户模式 (3)2-5 级 是多用户级别 (4)6级 是 重新引导的级别(1)查看防火墙 我一般都是把系统的防火墙关闭了。 因为开了会有很多限制。# /etc/init.d/iptables statusTable: natChain PREROUTING (policy ACCEPT)num target prot opt source destinationChain POSTROUTING (policy ACCEPT)num target prot opt source destination MASQUERADE all.168.122.0/24 !192.168.122.0/Chain OUTPUT (policy ACCEPT)num target prot opt source destinationTable: filterChain INPUT (policy ACCEPT)num target prot opt source destination ACCEPT udp.0.0.0/.0.0.0/udp dpt:ACCEPT tcp.0.0.0/.0.0.0/tcp dpt:ACCEPT udp.0.0.0/.0.0.0/udp dpt:ACCEPT tcp.0.0.0/.0.0.0/tcp dpt:67Chain FORWARD (policy ACCEPT)num target prot opt source destination ACCEPT all.0.0.0/92.168.122.0/24 state RELATED,ESTABLISHEDACCEPT all.168.122.0/.0.0.0/ ACCEPT all.0.0.0/.0.0.0/ REJECT all.0.0.0/.0.0.0/reject-with icmp-port-unreachableREJECT all.0.0.0/.0.0.0/reject-with icmp-port-unreachableChain OUTPUT (policy ACCEPT)num target prot opt source destinationYou have new mail in /var/spool/mail/root–添加开放21号端口:# /in/iptables -I INPUT -p tcp –dport 21 -j ACCEPT# /etc/init.d/iptables statusTable: natChain PREROUTING (policy ACCEPT)num target prot opt source destinationChain POSTROUTING (policy ACCEPT)num target prot opt source destination MASQUERADE all.168.122.0/24 !192.168.122.0/Chain OUTPUT (policy ACCEPT)num target prot opt source destinationTable: filterChain INPUT (policy ACCEPT)num target prot opt source destination ACCEPT tcp.0.0.0/.0.0.0/tcp dpt:ACCEPT udp.0.0.0/.0.0.0/udp dpt:ACCEPT tcp.0.0.0/.0.0.0/tcp dpt:ACCEPT udp.0.0.0/.0.0.0/udp dpt:ACCEPT tcp.0.0.0/.0.0.0/tcp dpt:67Chain FORWARD (policy ACCEPT)num target prot opt source destination ACCEPT all.0.0.0/92.168.122.0/24 state RELATED,ESTABLISHEDACCEPT all.168.122.0/.0.0.0/3 ACCEPT all.0.0.0/.0.0.0/ REJECT all.0.0.0/.0.0.0/reject-with icmp-port-unreachableREJECT all.0.0.0/.0.0.0/reject-with icmp-port-unreachableChain OUTPUT (policy ACCEPT)num target prot opt source destination保存配置# /etc/rc.d/init.d/iptables saveSaving firewall rules to /etc/sysconfig/iptables:–重启防火墙:# service iptables {startstoprestart}(2)查看关闭selinux# sestatusSELinux status: disabled我这里在安装操作系统的时候就关闭了selinux,如果没有关闭,可以修改如下文件来关闭:# cat /etc/sysconfig/selinux# This file controls the state of SELinux on the system.# SELINUX= can take one of these three values:#enforcing – SELinux security policy is enforced.#permissive – SELinux prints warnings instead of enforcing.#disabled – SELinux is fully disabled.SELINUX=disabled# SELINUXTYPE= type of policy in use. Possible values are:#targeted – Only targeted network daemons are protected.#strict – Full SELinux protection.SELINUXTYPE=targeted#保存退出并重启系统reboot三. FTP配置文件FTP 安装好之后,在/etc/vsftpd/目录下会有如下文件:# cd /etc/vsftpd/# lsftpusers user_list vsftpd.conf vsftpd_conf_migrate.sh#vsftpd.conf: 主配置文件ftpusers: 指定哪些用户不能访问FTP服务器user_list: 指定的用户是否可以访问ftp服务器由vsftpd.conf文件中的userlist_deny的取值来决定。# cat user_list# vsftpd userlist# If userlist_deny=NO, only allow users in this file# If userlist_deny=YES (default), never allow users in this file, and# do not even prompt for a password.# Note that the default vsftpd pam config also checks /etc/vsftpd/ftpusers# for users that are denied.我们过滤掉#的注释后,查看一下vsftpd.conf 文件:# cat /etc/vsftpd/vsftpd.conf grep -v ‘^#’;anonymous_enable=YESlocal_enable=YESwrite_enable=YESlocal_umask=022dirmessage_enable=YESxferlog_enable=YESconnect_from_port_20=YESxferlog_std_format=YESlisten=YESpam_service_name=vsftpduserlist_enable=yestcp_wrappers=YES至于这些参数的意思,在注释里有详细的说明。我们可以在vsftpd.conf 文件设置如下参数:(1)ftpd_banner=welcome to ftp service :设置连接服务器后的欢迎信息(2)idle_session_timeout=60 :限制远程的客户机连接后,所建立的控制连接,在多长时间没有做任何的操作就会中断(秒)(3)data_connection_timeout=120 :设置客户机在进行数据传输时,设置空闲的数据中断时间(4)accept_timeout=60 设置在多长时间后自动建立连接(5)connect_timeout=60 设置数据连接的更大激活时间,多长时间断开,为别人所使用;(6)max_clients=200 指明服务器总的客户并发连接数为200(7)max_per_ip=3 指明每个客户机的更大连接数为3(8)local_max_rate=50000(50kbytes/sec) 本地用户更大传输速率限制(9)anon_max_rate=30000匿名用户的更大传输速率限制(10)pasv_min_port=端口(11)pasv-max-prot=端口号 定义更大与最小端口,为0表示任意端口;为客户端连接指明端口;(12)listen_address=IP地址 设置ftp服务来监听的地址,客户端可以用哪个地址来连接;(13)listen_port=端口号 设置FTP工作的端口号,默认的为21(14)chroot_local_user=YES 设置所有的本地用户可以chroot(15)chroot_local_user=NO 设置指定用户能够chroot(16)chroot_list_enable=YES(17)chroot_list_file=/etc/vsftpd/chroot_list(只有/etc/vsftpd/chroot_list中的指定的用户才能执行 )(18)local_root=path 无论哪个用户都能登录的用户,定义登录帐号的主目录, 若没有指定,则每一个用户则进入到个人用户主目录;(19)chroot_local_user=yes/no 是否锁定本地系统帐号用户主目录(所有);锁定后,用户只能访问用户的主目录/home/user,不能利用cd命令向上转;只能向下;(20)chroot_list_enable=yes/no 锁定指定文件中用户的主目录(部分),文件:/chroot_list_file=path 中指定;(21)userlist_enable=YES/NO 是否加载用户列表文件;(22)userlist_deny=YES 表示上面所加载的用户是否允许拒绝登录;(23)userlist_file=/etc/vsftpd/user_list 列表文件限制IP 访问FTP:#vi /etc/hosts.allowvsftpd:192.168.5.128:DENY 设置该IP地址不可以访问ftp服务FTP 访问时间限制:#cp /usr/share/doc/vsftpd-1.1.3/vsftpd.xinetd /etc/xinetd.d/vsftpd#vi /etc/xinetd.d/vsftpd/修改 disable = noaccess_time = hour:min-hour:min (添加配置访问的时间限制(注:与vsftpd.conf中listen=NO相对应)例: access_time = 8:30-11:30 17:30-21:30 表示只有这两个时间段可以访问ftpftp的配置基本上只有这些了。默认情况下,ftp根目录是/var/ftp。 如果要修改这个目录位置,可以更改/etc/passwd 文件:# cat /etc/passwd grep ftpftp:x:14:50:FTP User:/var/ftp:/in/nologin创建一个用户来访问FTP,并指定该用户的FTP 目录:# useradd -d /u02/qsftp qs# passwd qsChanging password for user qs.New UNIX password:BAD PASSWORD: it is WAY too shortRetype new UNIX password:passwd: all authentication tokens updated successfully.这里指定的是/u02/qsftp 这个目录,要注意个目录的权限。更改用户不能telnet,只能ftp:usermod -s /in/nologin username //用户只能ftp,不能telnetusermod -s /in/bash username //用户恢复正常禁止用户ssh登陆useradd username -s /bin/false 更改用户主目录:usermod -d /bbb username//把用户的主目录定为/bbb然后用qs这个用户就可以访问了。以上只是一些简单的设置。 在用户权限这块还有很多内容可以研究。 比如特定用户的特定权限。 安全性等。 以后在研究了。linux c tcp connect的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于linux c tcp connect,深入理解 Linux 下 C 语言 TCP Connect 编程技巧,如何在linux下用tcp传输文件的信息别忘了在本站进行查找喔。


数据运维技术 » 深入理解 Linux 下 C 语言 TCP Connect 编程技巧 (linux c tcp connect)