在linux下如何用c语言来写一个socket编程的聊天小程序

在linux下如何用c语言来写一个socket编程的聊天小程序,第1张

源码如下:

//chat_one.c

#include <sys/types.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <stdio.h>

#include <string.h>

#include <errno.h>

#include <malloc.h>

#include <sys/select.h>

int main( int argc, char **argv)

{

struct sockaddr_in chatone, chattwo

char pmsg[1000]

char *buf

intchatone_fd

intret,i

intlen, msg_len

fd_set fdset

if ( argc <2 ){

printf("please input ip address\n")

return -1

}

printf("server address is %s\n", argv[1])

chattwo.sin_family = AF_INET

chattwo.sin_port = htons(60002)

inet_pton(AF_INET, argv[1], &chattwo.sin_addr.s_addr)

chatone.sin_family = AF_INET

chatone.sin_port = htons(60000)

chatone.sin_addr.s_addr = INADDR_ANY

chatone_fd = socket(PF_INET, SOCK_DGRAM, 0)

if ( -1 == chatone_fd ){

printf("create socket failed %s\n", strerror(errno))

return -1

}

ret = bind(chatone_fd, (struct sockaddr *)&chatone, sizeof(chatone))

if ( -1 == ret){

printf("bind failed %s \n", strerror(errno))

return -1

}

for(i=0i<1000i++){

FD_ZERO( &fdset )

FD_SET ( 0, &fdset)

FD_SET( chatone_fd, &fdset)

if ( -1 == select ( chatone_fd+1, &fdset, NULL, NULL, NULL) ){

continue

}

if ( FD_ISSET( chatone_fd, &fdset)){

recvfrom( chatone_fd, pmsg, 999, 0, NULL, 0)

printf("receive %s\n", pmsg)

}

else{

memset( pmsg, 0, 1000)

fgets(pmsg, 999, stdin)

len = sizeof(chattwo)

sendto( chatone_fd, pmsg, 1000, 0,\

(struct sockaddr*) &chattwo, len)

printf("send %s\n", pmsg)

}

}

printf("sent %d packets\n", i)

close(chatone_fd)

return 0

}

//chat_two.c

#include <sys/types.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <stdio.h>

#include <string.h>

#include <errno.h>

#include <malloc.h>

#include <sys/select.h>

int main( int argc, char **argv)

{

struct sockaddr_in chatone, chattwo

char pmsg[1000]

char *buf

intchattwo_fd

intret,i

intlen, msg_len

fd_set fdset

if ( argc <2 ){

printf("please input ip address\n")

return -1

}

printf("server address is %s\n", argv[1])

chattwo.sin_family = AF_INET

chattwo.sin_port = htons(60002)

chattwo.sin_addr.s_addr = INADDR_ANY

chatone.sin_family = AF_INET

chatone.sin_port = htons(60000)

inet_pton(AF_INET, argv[1], &chatone.sin_addr.s_addr)

chattwo_fd = socket(PF_INET, SOCK_DGRAM, 0)

if ( -1 == chattwo_fd ){

printf("create socket failed %s\n", strerror(errno))

return -1

}

ret = bind(chattwo_fd, (struct sockaddr *)&chattwo, sizeof(chattwo))

if ( -1 == ret){

printf("bind failed %s \n", strerror(errno))

return -1

}

for(i=0i<1000i++){

FD_ZERO( &fdset )

FD_SET ( 0, &fdset)

FD_SET( chattwo_fd, &fdset)

if ( -1 == select ( chattwo_fd+1, &fdset, NULL, NULL, NULL) ){

continue

}

if ( FD_ISSET( chattwo_fd, &fdset)){

recvfrom( chattwo_fd, pmsg, 999, 0, NULL, 0)

printf("receive: %s\n", pmsg)

}

else{

memset( pmsg, 0, 1000)

fgets(pmsg, 999, stdin)

len = sizeof(chatone)

sendto( chattwo_fd, pmsg, 1000, 0,\

(struct sockaddr*) &chatone, len)

printf("send %s\n", pmsg)

}

}

printf("sent %d packets\n", i)

close(chattwo_fd)

return 0

}

编译好这个两个程序就可以进行简单的通信了。

一般来讲,你说的这种功能是这样实现的:用VB或者VC在计算机上面编写一个应用程序 *** 作界面,一般称为上位机,通过COM串口和下位机(一般是一个单片机系统)物理连接,通过上位机发出指令,也就是通过计算机COM串口发出一些数据。通常是要约定好波特率、数据位、校验等,下位机根据上位机的指令做出执行 *** 作,I/O口输出一个电平去控制继电器,再去控制强电。

如果你只保留计算机,用计算机的COM串口直接作为输出驱动,是有问题的。分析如下,因为计算机的串口主要用途是通讯,即传送一些RS232电平的信号,比如传送数字1、2、3。。。或者是字母A、B、C。。。。。等,即使是传送一位也会同时有0逻辑和1逻辑出现,即不能一直让串口线的TX线一直输出逻辑0的,所以无法实现你说的功能。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/8123787.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-13
下一篇2023-04-13

发表评论

登录后才能评论

评论列表(0条)

    保存