至于c#微软的产品,我很不喜欢,所以在c#方面我给不了你的具体的代码!
在linux ubuntu 请使用gcc编译器。
我可以给你看看c代码实现的通信模型:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#define MAXLINE 4096
int main(int argc, char **argv)
{
int listenfd, connfd;
struct sockaddr_in servaddr;
char buff[4096];
int n;
if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
printf("create socket error: %s(errno: %d)\n",
strerror(errno), errno);
exit(0);
}
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(8888);
if (bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr))
== -1) {
printf("bind socket error: %s(errno: %d)\n",
strerror(errno), errno);
exit(0);
}
if (listen(listenfd, 10) == -1) {
printf("listen socket error: %s(errno: %d)\n",
strerror(errno), errno);
exit(0);
}
printf("======waiting for client's request======\n");
while (1) {
if ((connfd =
accept(listenfd, (struct sockaddr *) NULL,
NULL)) == -1) {
printf("accept socket error: %s(errno: %d)",
strerror(errno), errno);
continue;
}
while(n = recv(connfd, buff, MAXLINE, 0)){
buff[n] = '\0';
printf("recv msg from client: %s\n", buff);
if(!strcmp(buff,"quit")){
close(connfd);
break;
}
}
}
close(listenfd);
}
客户端:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#define MAXLINE 4096
int main(int argc, char **argv)
{
int sockfd, n;
char recvline[4096], sendline[4096];
struct sockaddr_in servaddr;
if (argc != 2) {
printf("usage: ./client <port>\n");
exit(0);
}
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
printf("create socket error: %s(errno: %d)\n",
strerror(errno), errno);
exit(0);
}
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(8888);
if (inet_pton(AF_INET,argv[1], &servaddr.sin_addr) <= 0) {
printf("inet_pton error for %s\n", argv[1]);
exit(0);
}
if (connect
(sockfd, (struct sockaddr *) &servaddr,
sizeof(servaddr)) < 0) {
printf("connect error: %s(errno: %d)\n", strerror(errno),
errno);
exit(0);
}
while(1){
printf("send msg to server: \n");
fgets(sendline, 4096, stdin);
if (send(sockfd, sendline, strlen(sendline), 0) < 0) {
printf("send msg error: %s(errno: %d)\n", strerror(errno),
errno);
exit(0);
}
}
close(sockfd);
exit(0);
}
这 只是实现简单的通信,要实现聊天室的话你需要至少做以下一些事:
(1)使用数据库,例如mysql管理客户的账户信息
(2)我给你的代码只是单进程模型,而一个聊天室应该是针对大量用户的,
所以你应该写的是并发服务器,在linux你可以使用epoll多路复用配合多线程,
当然,最好是用线程池效率更加高
(3)至于,web方面,你还应该会编写CGI以调用mysql数据
(4)最后,我建议,要是真想了解socket通讯,你应该精通我给你的代码
然后再客服通讯时,自己抓包分析,(推荐用wireshark软件抓包)
这样你才能真正的理解所谓的三次握手(当然,这是我当初理解socket通讯过程的方式)
希望对你有帮助!