⑴ 毕业论文《基于socket 的局域网聊天工具》,要求C++语音编写,要有程序,能实现,有文档……

“对图中的那些函数,我这里稍加解释一下。”

intWSAStartup(WORDwVersionRequested,LPWSADATAlpWSAData);

功能是初始化WindowsSocketDll,在Windows下必须使用它。

参数:

“wVersionRequested”表示版本,可以是1.1、2.2等;

“lpWSAData”指向WSADATA数据结构的指针。

intsocket(intfamily,inttype,intprotocol);

功能是建立Socket,返回以后会用到的Socket值。如果错误,返回-1。

参数:

“intfamily”参数指定所要使用的通信协议,取以下几个值:AF_UNIX(Unix内部协议)、AF_INET(Internet协议)、AF_NSXerox(NS协议)、AF_IMPLINK(IMP连接层),在Windows下只能把“AF”设为“AF_INET”;

“inttype”参数指定套接字的类型,取以下几个值:SOCK_STREAM(流套接字)、SOCK_DGRAM(数据报套接字)、SOCK_RAW(未加工套接字)、SOCK_SEQPACKET(顺序包套接字);

“intprotocol”参数通常设置为0。

intbind(intsockfd,structsockaddr*my_addr,intaddrlen);

功能是把套接字和机器上一定的端口关联起来。

参数:

“sockfd”是调用socket()返回的套接字值;

“my_addr”是指向数据结构structsockaddr的指针,它保存你的地址,即端口和IP地址信息;

“addrlen”设置为sizeof(structsockaddr)。

intlisten(intsockfd,intbacklog);

功能是服务端监听一个端口,直到accept()。在发生错误时返回-1。

参数:

“sockfd”是调用socket()返回的套接字值;

“backlog”是允许的连接数目。大多数系统的允许数目是20,也可以设置为5到10。

intconnect(intsockfd,structsockaddr*serv_addr,intaddrlen);

功能是客户端连接服务端监听的端口。

参数:

“sockfd”是调用socket()返回的套接字值;

“serv_addr”保存着目的地端口和IP地址的数据结构structsockaddr;

“addrlen”设置为sizeof(structsockaddr)。

intaccept(intsockfd,void*addr,int*addrlen);

功能是服务端接受客户端的连接请求,并返回一个新的套接字,以后服务端的数据传输就使用这个新的套接字。如果有错误,返回-1。

参数:

“sockfd”是和listen()中一样的套接字值;

“addr”是个指向局部的数据结构sockaddr_in的指针;

“addrlen”设置为sizeof(structsockaddr_in)。

intsend(intsockfd,constvoid*msg,intlen,intflags);

intrecv(intsockfd,void*buf,intlen,unsignedintflags);

功能是用于流式套接字或数据报套接字的通讯,我们数据的真正传输就由它们完成。

参数:

“sockfd”是发/收数据的套接字值;

“msg”指向你想发送的数据的指针;

“buf”是指向接收数据存放的地址;

“len”是数据的长度;

“flags”设置为0。

intsendto(intsockfd,constvoid*msg,intlen,unsignedintflags,conststructsockaddr*to,inttolen);

intrecvfrom(intsockfd,void*buf,intlen,unsignedintflags,structsockaddr*from,int*fromlen);

功能和send、recv类似,不过是用于无连接数据报套接字的传输。

intclosesocket(intsockfd)

功能是关闭套接字。

参数“sockfd”为要关闭的套接字值。

程序:

“这里的目的是让大家对Socket编程有个整体了解。不用怕,程序我会详细解释的,首先是服务端的程序。其流程是:

socket()→bind()→listen→accept()→recv()/send()→closesocket()

具体代码如下:”

#include<stdio.h>

#include<winsock.h>

#pragmacomment(lib,"Ws2_32")

#defineMYPORT830/*定义用户连接端口*/

#defineBACKLOG10/*多少等待连接控制*/

intmain()

{

intsockfd,new_fd;/*定义套接字*/

structsockaddr_inmy_addr;/*本地地址信息*/

structsockaddr_intheir_addr;/*连接者地址信息*/

intsin_size;

WSADATAws;

WSAStartup(MAKEWORD(2,2),&ws);//初始化WindowsSocketDll

//建立socket

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

{

//如果建立socket失败,退出程序

printf("socketerror ");

exit(1);

}

//bind本机的MYPORT端口

my_addr.sin_family=AF_INET;/*协议类型是INET*/

my_addr.sin_port=htons(MYPORT);/*绑定MYPORT端口*/

my_addr.sin_addr.s_addr=INADDR_ANY;/*本机IP*/

if(bind(sockfd,(structsockaddr*)&my_addr,sizeof(structsockaddr))==-1)

{

//bind失败,退出程序

printf("binderror ");

closesocket(sockfd);

exit(1);

}

//listen,监听端口

if(listen(sockfd,BACKLOG)==-1)

{

//listen失败,退出程序

printf("listenerror ");

closesocket(sockfd);

exit(1);

}

printf("listen...");

//等待客户端连接

sin_size=sizeof(structsockaddr_in);

if((new_fd=accept(sockfd,(structsockaddr*)&their_addr,&sin_size))==-1)

{

printf("accepterror ");

closesocket(sockfd);

exit(1);

}

printf(" accept! ");

//有连接,发送ww0830字符串过去

if(send(new_fd,"ww0830 ",14,0)==-1)

{

printf("senderror");

closesocket(sockfd);

closesocket(new_fd);

exit(1);

}

printf("sendok! ");

//成功,关闭套接字

closesocket(sockfd);

closesocket(new_fd);

return0;

}

对服务端程序的流程概括:

先是初始化WindowsSocketDll:WSAStartup(MAKEWORD(2,2),&ws);

然后建立Socket:sockfd=socket(AF_INET,SOCK_STREAM,0)

再bind本机的MYPORT端口:

my_addr.sin_family=AF_INET;/*协议类型是INET*/

my_addr.sin_port=htons(MYPORT);/*绑定MYPORT端口*/

my_addr.sin_addr.s_addr=INADDR_ANY;/*本机IP*/

bind(sockfd,(structsockaddr*)&my_addr,sizeof(structsockaddr))

接下来监听端口:listen(sockfd,BACKLOG)

如果有客户端的连接请求,接收它:new_fd=accept(sockfd,(structsockaddr*)&their_addr,&sin_size)

最后发送ww0830字符串过去:send(new_fd,"ww0830 ",14,0)

收尾工作,关闭socket:closesocket(sockfd);closesocket(new_fd);”

编译、执行,就会一直监听830端口

客户端程序了。其流程是:

socket()→connect()→send()/recv()→closesocket()

比服务端更简单吧!其实现代码如下:”

#include<stdio.h>

#include<stdio.h>

#include<winsock.h>

#pragmacomment(lib,"Ws2_32")

#definePORT830/*客户机连接远程主机的端口*/

#defineMAXDATASIZE100/*每次可以接收的最大字节*/

intmain(intargc,char*argv[])

{

intsockfd,numbytes;

charbuf[MAXDATASIZE];

structsockaddr_intheir_addr;/*对方的地址端口信息*/

if(argc!=2)

{

//需要有服务端ip参数

fprintf(stderr,"usage:clienthostname ");

exit(1);

}

WSADATAws;

WSAStartup(MAKEWORD(2,2),&ws);//初始化WindowsSocketDll

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

{

//如果建立socket失败,退出程序

printf("socketerror ");

exit(1);

}

//连接对方

their_addr.sin_family=AF_INET;/*协议类型是INET*/

their_addr.sin_port=htons(PORT);/*连接对方PORT端口*/

their_addr.sin_addr.s_addr=inet_addr(argv[1]);/*连接对方的IP*/

if(connect(sockfd,(structsockaddr*)&their_addr,sizeof(structsockaddr))==-1)

{

//如果连接失败,退出程序

printf("conneterror ");

closesocket(sockfd);

exit(1);

}

//接收数据,并打印出来

if((numbytes=recv(sockfd,buf,MAXDATASIZE,0))==-1)

{

//接收数据失败,退出程序

printf("recverror ");

closesocket(sockfd);

exit(1);

}

buf[numbytes]='';

printf("Received:%s",buf);

closesocket(sockfd);

return0;

}

对客户端程序的流程概括:

首先是初始化WindowsSocketDll:WSAStartup(MAKEWORD(2,2),&ws);

然后建立Socket:sockfd=socket(AF_INET,SOCK_STREAM,0)

接着连接服务器方:

their_addr.sin_family=AF_INET;/*协议类型是INET*/

their_addr.sin_port=htons(PORT);/*连接对方PORT端口*/

their_addr.sin_addr.s_addr=inet_addr(argv[1]);/*连接对方的IP*/

connect(sockfd,(structsockaddr*)&their_addr,sizeof(structsockaddr))

连接成功就接收数据:recv(sockfd,buf,MAXDATASIZE,0)

最后把收到的数据打印出来并关闭套接字:

printf("Received:%s",buf);closesocket(sockfd);

编译结束后,运行服务端,然后。客户端服务端IP回车

你会看到服务端发来得数据。

那么基本的点对点通信就没问题了。只要两台机器同时包含服务端和客户端,就可以互相通信了。

当然,你也可以将服务端和客户端分开做,专门一个服务器负责用户登录和转发消息。

流程如下:

A客户端发登录消息-----》服务器

服务器验证发送用户消息----》客户端

A客户端想发消息给B客户端----》先发给服务端

服务器得到消息查询B客户端IP并转发消息。(或者B客户端循环发消息询问服务器有无消息)

通信结束。

⑵ 在windows下,如何用纯C语言实现socket网络编程

mfc只是对socket进行了一些封装,大部分人做
网络编程
都是用的原始的socket,比如如下接口都可以在版c下进行调用
1.socket()
2.bind()
3.connect()
4.listen()
5.accept()
6.send()
和权recv()
7.sendto()
和recvfrom()
8.close()
和shutdown()
9.
getpeername
()
10.
gethostname
()
这些接口是在Winsock2.h中定义的不是在mfc中定义的,你只需要包含Winsock2.h
头文件

Ws2
_32.lib库就可以了。

⑶ 谁能用C语言写个最简单socket通信服务端和客户端示例

网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符。Socket也具有一个类似于打开文件的函数调用Socket(),该函数返回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。
下面用Socket实现一个windows下的c语言socket通信例子,这里我们客户端传递一个字符串,服务器端进行接收。
【服务器端】
#include "stdafx.h"
#include <stdio.h>
#include <winsock2.h>
#include <winsock2.h>
#define SERVER_PORT 5208 //侦听端口
void main()

⑷ linux下用c语言编写局域网聊天工具

网上有一些现成的基于gtk的聊天程序源代码 可以参考参考的 还有 有一本书gtk实例教程 里面也有多人聊天服务器及客户端的程序代码 都可以看看的~~~呵呵!

⑸ 如何用C语言编写一个简单的聊天室程序

这样:

#include <stdlib.h>

#include <stdio.h>

#include <errno.h>

#include <string.h>

#include <unistd.h>

#include <netdb.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <sys/types.h>

#include <arpa/inet.h>

#include <pthread.h>

#define MAXLINE 100;

void *threadsend(void *vargp);

void *threadrecv(void *vargp);

int main()

{

int *clientfdp;

clientfdp = (int *)malloc(sizeof(int));

*clientfdp = socket(AF_INET,SOCK_STREAM,0);

struct sockaddr_in serveraddr;

struct hostent *hp;

bzero((char *)&serveraddr,sizeof(serveraddr));

serveraddr.sin_family = AF_INET;

serveraddr.sin_port = htons(15636);

serveraddr.sin_addr.s_addr = inet_addr("127.0.0.1");

if(connect(*clientfdp,(struct sockaddr *)&serveraddr,sizeof(serveraddr)) < 0){

printf("connect error ");

exit(1);

}

pthread_t tid1,tid2;

printf("connected ");

while(1){

pthread_create(&tid1,NULL,threadsend,clientfdp);

pthread_create(&tid2,NULL,threadrecv,clientfdp);

}

return EXIT_SUCCESS;

}

void *threadsend(void * vargp)

{

//pthread_t tid2;

int connfd = *((int *)vargp);

int idata;

char temp[100];

while(1){

//printf("me: ");

fgets(temp,100,stdin);

send(connfd,temp,100,0);

printf(" client send OK ");

}

printf("client send ");

return NULL;

}

void *threadrecv(void *vargp)

{

char temp[100];

int connfd = *((int *)vargp);

while(1){

int idata = 0;

idata = recv(connfd,temp,100,0);

if(idata > 0){

printf("server : %s ",temp);

}

}

return NULL;

}

(5)socket局域网聊天软件c语言扩展阅读:

注意事项

linux下编译多线程代码时,shell提示找不到 pthread_create函数,原因是 pthread.h不是linux系统默认加载的库文件,应该使用类似如下gcc命令进行编译:

gcc echoserver.c -lpthread -o echoserver

只要注意 -lpthread参数就可以了。

⑹ 关于用C语言开发一个简单的局域网聊天软件

Linux系统都是C写的 用C当然行得通

就是个socket编程嘛

我们原来做过一个的原理描述 当然内 这个是C\S模式容的 其实你可以做成 无服务端的

本系统具有局域网聊天功能。采用了C\S模式(即服务器创建套接字后,转换为监听套接字,一直在监听是否由客户端的请求。服务器接收到相应的请求后,进行相应的处理)。采用了TCP/IP(面向连接)协议。运用了SOCKET套接字实现了很方便的访问TCP/IP协议。多线程的操作。
服务器的程序(简述):
创建socket-->bind()-->listen()-->accept()-->recv/send()-->close();
客户端的程序(简述):
创建scoket-->发送connect-->recv/send()-->close();

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

源码如下:
//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;
int chatone_fd;
int ret,i;
int len, 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=0; i<1000;i++){
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;
int chattwo_fd;
int ret,i;
int len, 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=0; i<1000;i++){
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;
}
编译好这个两个程序就可以进行简单的通信了。